通信的简单实现
通信的简单实现
物理上的一台电脑有很多端口,[每个端口都可以起到服务端或客户端的作用,所以在建立客户端是要选择哪一个端
口,当在自己的电脑上面运行一个服务端程序是,本台主机就是服务器,当我们用CMD命令行
时,如果用的命令是telnet127.0.0.1XXXX(指端口号),相当于服务器连接的主机客户端是本台主机,这是,我们运行程序的这台主机就充当了服务器和客户端两个角色,如果ip地址的位置改为其他的,则该ip地址代表的那台主机就代表客户端,例如,telnet198.168.1.120XXXX,那么现在我的主机就只充当服务器,而由198.168.1.120这台主机充当客户端。
Socket可以看成在两个程序进行通讯连接中的一个端点,一个程序将一段信息写入Socket中,该Socket将这段信息发送给另外一个Socket中,使这段信息能传送到其他程序中。
套接字相当于一个媒介,用来在服务器和客户端之间转送信息。那么,服务器要能接收从客户端发来的消息的话,的有一个这样的一个服务器套接字对象ServerSocketss,处理异常,创建之后,服务器就处于等待状态,等待有数据输入过来。
通信,其最核心的东西不过是服务器和客户端之间消息的发送,对每一方都有两种情况,消息的输入和输出,所以得有输入流和输出流对象(InputStream和OutputStream)。
服务器给客户端发送的消息
消息是一个字符串,输出流写[/size]这条消息时事一个个字节写出去的,所以先把要输出的字符串放在一个字节数组里存储再写。例如
Strings="中国";
byte[]bs=s.getBytes();
out.write(bs);
客户端给服务器发送消息,服务器在接收消息是也是只能一个字节一个字节的读取,所以首先要有一个对象接收读取得此消息t,建立一个缓冲数组来暂存读了的字节,等到整条消息都读完后在一起转为字符串输出;但是,有怎么样判断一条消息是否已经读完呢,所以,我们可以设置一个结束标志,当计算机读到该标志时就结束读取工作,代码如下:
//以本台主机位服务器,要读取客户端发来的消息的话,要建立一个对象接收读出来的消息
intt=ins.read();
//若需要将读进去的字符串输出来,可用一个缓冲数组存放,当一条消息读完之后再把给消息以字符串的形式转出来
java.lang.StringBufferstr=newjava.lang.StringBuffer();
//对于一条消息总该有个结束的标志,我们一遇到#结束,故用一个循环
while(t!='#'){
System.out.println("thecharis"+t);
//接着读取下一个字节
t=ins.read();
//把字节打印出来
str.append((char)t);
}
//把字节转换成字符串打印
Stringims=str.toString();
System.out.println("themessageis:"+ims);
(3)全部代码
packagetx2014713;
importjava.io.IOException;
importjava.io.InputStream;
importjava.io.OutputStream;
importjava.net.ServerSocket;
importjava.net.Socket;
//简单的客户端
/**
*
*@authorliuli
*@port电脑上的某个端口,需要自己指定
*/
publicclassSever{
//客户端中的一个执行任务的函数,在主函数中调用,物理上的一台电脑有好很多端口,
//每个端口都可以起到服务端或客户端的作用,所以在建立客户端是要选择哪一个端口
publicvoidsetup(intPort){
//接下来就到通信的入点,建立服务器套接字,并指定服务器端口
try{
ServerSocketss=newServerSocket(Port);
System.out.println("你访问的端口是:"+Port);
//此时服务器处于阻塞状态,在等待客户端的访问
//当有客户端访问了之后,服务器的等待方法结束,返回一个代表与客户端连接的对象
while(true){//服务器进入循环等待状态,即当一个客户端访问完了之后,服务器不会随之而关闭
Socketsocket=ss.accept();
//建立套接字对象之后,服务器要和客户端交换信息的话,需要建立输入输出流
InputStreamins=socket.getInputStream();
OutputStreamout=socket.getOutputStream();
//服务器要发送给客户端的一串字符串
Strings="丽丽";
//计算机在读消息是不能直接读取字符串而是一个一个的字节读,所以先把字符串读到一个字节数组中存放起来
byte[]bb=s.getBytes();
//通过输出流对象将字节数组的内容写出去
//out.write(bb);
out.write(s.getBytes("GBk"));
//以本台主机位服务器,要读取客户端发来的消息的话,要建立一个对象接收读出来的消息
intt=ins.read();
//若需要将读进去的字符串输出来,可用一个缓冲数组存放,当一条消息读完之后再把给消息以字符串的形式转出来
java.lang.StringBufferstr=newjava.lang.StringBuffer();
//对于一条消息总该有个结束的标志,我们一遇到#结束,故用一个循环
while(t!='#'){
System.out.println("thecharis"+t);
//接着读取下一个字节
t=ins.read();
//把字节打印出来
str.append((char)t);
}
//把字节转换成字符串打印
Stringims=str.toString();
System.out.println("themessageis:"+ims);
}
}catch(IOExceptione){
e.printStackTrace();
}
}
publicstaticvoidmain(String[]args){
Severse=newSever();
se.setup(5678);
}