通信的简单实现

通信的简单实现

物理上的一台电脑有很多端口,[每个端口都可以起到服务端或客户端的作用,所以在建立客户端是要选择哪一个端

口,当在自己的电脑上面运行一个服务端程序是,本台主机就是服务器,当我们用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);

}

相关推荐