`
快乐的拖拉机
  • 浏览: 9174 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

通信的简单实现

阅读更多
拖了好久了,突然间觉得这迟到的总结不应该总结关于什么技术的事情了!技术博客是一个阶段的学习成果的总结,但是我觉得这篇博客首先应该总结一下自己的思想了!
在每个学期的开始每个人都会有一段时间的学习热情期,那段时间里脑子里幻想着好多东西,幻想着这样下去自己的收获该是多么的多,幻想着成为大神的种种!但是大神之路不是每个人想的那样简单,只有坚持不懈的坚持下去,才是唯一的真理!突然间发现自己又是如此的懒惰了,就是一篇很简单的技术博客也拖拉了这么久!是因为不会么?对,好像就是这个原因。但是不会为什么不去写技术博客呢?因为不会!每次我们都在给自己找一些可有苦无的借口,“不会”应该是一个特别经典的了!面对经典我们总是显得那么的脆弱,没有想着如何去突破这个叫经典的东西。最后的结果也就是不会了,到最终也是不会了!
   突然觉得坚持是一种最可贵品质了!学会了去坚持,也就学会未来的了人生!
   前些天学了关于通信的相关内容,实现了从自己在自己的电脑上相连接进行对话到与他人的电脑相连接,再到多个会话窗口的同时连接对话!
首先来了解一下qq聊天的的基本思想:
   在指定的端口上创建一个服务器对象-让服务器进入待机状态,等待客户机的连接从连接成功的客户机上得到输入输出流读取客户机发来的数据,向客户机发数据;这样,一个简单的聊天功能就实现了
首先了解一下ServerSocket和Socket类的相关方法:
ServerSocket中常用的构造函数及方法:
构造函数:ServerSocket(int port) 这是一个构造方法,用于在当前的服务器默认的IP地址上监听一个指定的端口,即在指定的IP和端口创建一个ServerSocket对象
方法:
Socket accept() 产生阻塞,监听指定的端口,直至有客户端发来连接请求
void close() 关闭当前ServerSocket
InetAddress getInetAddress() 返回ServerSocket监听的,本机的IP地址
int getLocalPort() 返回ServerSocket监听的,本机的IP地址上指定的端口号
int getSoTimeout();void setSoTimeout(int timeout) 设置连接过程中没有得到相应的等待期限时间(TimeOut)
String toString()   以字符串的方式返回ServerSocket监听的,本机的IP地址及其端口号
Socket类中常用的构造函数和方法:
构造函数:Socket(InetAddress address,int port) 用于创建一个链接,向指定的IP地址上指定的端口的服务器端程序发送连接请求
Socket(String host,int port)   同上,但该方法允许通过主机名字符串向服务器发送连接请求
方法:
void close()关闭当前的Socket 连接
InetAddress getInetAddress() 返回Socket建立了连接的服务器的IP地址
InputStream getInputStream() 返回当前Socket的输入流
OutputStream getOutStream() 返回当前Socket的输出流
InetAddress getLocalAddress() 返回和Socket进行连接的本地的IP地址
int getLocalPort() 返回和Socket进行连接的本地的端口号
int getPort() 返回和Socket建立了连接的服务器的端口号
int getSoTimeOut();void setSoTimeOut(int timeout) 设置连接过程中没有得到相应的等待期限时间
String toString () 以字符串的方式返回Socket的属性信息
如果要实现多个会话窗口就应该是多线程的问题,只需要让服务器继承线程类,当在待机状态下每有一个客户机来连接的时候就产生一个线程去处理对应的客户机对象!
代码如下:
//public void setUpSever(int port) throws IOException{
// ServerSocket serve =new ServerSocket(port);
//System.out.println("服务器创建成功"+port);
//try {
// while(true){//服务器进入循环等待状态
// Socket client=serve.accept();
// ServeThread st=new ServeThread(client);
// st.start();
// System.out.println("线程已经启动");
// }
// {
// //创建服务器
// java.net.ServerSocket serve=new ServerSocket(port);
// System.out.println("服务器创建成功!"+port);
// Socket client=serve.accept();
// //de得到消息
// String s=client.getRemoteSocketAddress().toString();
// //从连接对象上得到输入输出流
// InputStream in=client.getInputStream();
//     OutputStream ou=client.getOutputStream();
//     String s1="欢迎聊天!";
//     //将字符串转化为字节数组
//     byte[] data=s1.getBytes();
//     ou.write(data);
//    String s2=new String (data);
//    System.out.println("输入得字符串是:"+s2);
//     ou.flush();//强制输出
//
//     int du=0;
//
//     while(du!=13)
//     {
//     du=in.read();
//     System.out.println("当前读到的是:"+du);
//     }
//     System.out.println("你现在输入的是回车键,结束:"+du);
//     String s4=ReadingString(in);
//     System.out.println("缓存输出字符串:"+s4);
//     client.close();
// }
// }catch(Exception ef){
// ef.printStackTrace();
// }

ServeThread 类代码:
package Tongxin;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class ServeThread extends Thread {
private OutputStream ou;
private Socket client;
public  ServeThread(Socket s)
{
this.client=s;
}
public void run()
{
try {
processChat(this.client);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void Sendmassenge(String m) throws IOException{
byte[] data =m.getBytes();
ou.write(data);//用输出对象发送
ou.flush();//强制输出
}
private void processChat(Socket client) throws IOException
{
ou=client.getOutputStream();//得到输出流,输入流
InputStream in=client.getInputStream();
String s="欢迎来聊天@!";
this.Sendmassenge(s);
String inputs=readString(in);//读取客户机的信息
while(!inputs.equals("end")){
System.out.println("对方发来消息:"+inputs);
s="回复:我认识你的哦\r\n";
this.Sendmassenge(s);
inputs=readString(in);
}
s="再见!";
this.Sendmassenge(s);
client.close();
}
private String readString(InputStream in) throws IOException {
StringBuffer sbf=new StringBuffer();//创建一个缓冲区域
char c=0;
while(c!=13){//遇到换行符就是发送信息
int i=in.read();//读取客户机发来的每一个字节,返回整数值
c=(char)i;//将返回的数字在转化为对应的字节
sbf.append(c);//将得到的字节存到缓冲区域!
}
String inputs=sbf.toString().trim();
return inputs;
}
}

  组后附上一个网址:http://hi.baidu.com/xiuyuanvip/item/fbe37c06e491b6ef359902e1
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics