通信的简单实现

                 通信的简单实现
      
物理上的一台电脑有很多端口,[每个端口都可以起到服务端或客户端的作用,所以在建立客户端是要选择哪一个端
口,当在自己的电脑上面运行一个服务端程序是,本台主机就是服务器,当我们用CMD命令行
时,如果用的命令是telnet 127.0.0.1 XXXX(指端口号),相当于服务器连接的主机客户端是本台主机,这是,我们运行程序的这台主机就充当了服务器和客户端两个角色,如果ip地址的位置改为其他的,则该ip地址代表的那台主机就代表客户端,例如,telnet 198.168.1.120 XXXX,那么现在我的主机就只充当服务器,而由198.168.1.120这台主机充当客户端。
      Socket可以看成在两个程序进行通讯连接中的一个端点,一个程序将一段信息写入Socket中,该Socket将这段信息发送给另外一个Socket中,使这段信息能传送到其他程序中。
套接字相当于一个媒介,用来在服务器和客户端之间转送信息。那么,服务器要能接收从客户端发来的消息的话,的有一个这样的一个服务器套接字对象 ServerSocket ss,处理异常,创建之后,服务器就处于等待状态,等待有数据输入过来。
      通信,其最核心的东西不过是服务器和客户端之间消息的发送,对每一方都有两种情况,消息的输入和输出,所以得有输入流和输出流对象(InputStream和OutputStream)。
服务器给客户端发送的消息
   消息是一个字符串,输出流写[/size]这条消息时事一个个字节写出去的,所以先把要输出的字符串放在一个字节数组里存储再写。例如
                          String s="中国";
  byte[] bs=s.getBytes();
       out.write(bs);
    
客户端给服务器发送消息,服务器在接收消息是也是只能一个字节一个字节的读取,所以首先要有一个对象接收读取得此消息t,建立一个缓冲数组来暂存读了的字节,等到整条消息都读完后在一起转为字符串输出;但是,有怎么样判断一条消息是否已经读完呢,所以,我们可以设置一个结束标志,当计算机读到该标志时就结束读取工作,代码如下:
  //以本台主机位服务器,要读取客户端发来的消息的话,要建立一个对象接收读出来的消息
int t=ins.read();
//若需要将读进去的字符串输出来,可用一个缓冲数组存放,当一条消息读完之后再把给消息以字符串的形式转出来
java.lang.StringBuffer str=new java.lang.StringBuffer();
//对于一条消息总该有个结束的标志,我们一遇到#结束,故用一个循环
while(t!='#'){
System.out.println("the char is"+t);
//接着读取下一个字节
t=ins.read();
//把字节打印出来

str.append((char)t);

}
     //把字节转换成字符串打印
String ims=str.toString();
System.out.println("the message is:"+ims);
(3)全部代码
     package tx2014713;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;


//简单的客户端
/**
*
* @author liuli
* @port  电脑上的某个端口,需要自己指定
*/
public class Sever {
//客户端中的一个执行任务的函数,在主函数中调用,物理上的一台电脑有好很多端口,
//每个端口都可以起到服务端或客户端的作用,所以在建立客户端是要选择哪一个端口
       public void setup(int Port){
    //接下来就到通信的入点,建立服务器套接字,并指定服务器端口
    try {
ServerSocket ss=new ServerSocket(Port);
System.out.println("你访问的端口是:"+Port);
//此时服务器处于阻塞状态,在等待客户端的访问
//当有客户端访问了之后,服务器的等待方法结束,返回一个代表与客户端连接的对象
while(true){ //服务器进入循环等待状态,即当一个客户端访问完了之后,服务器不会随之而关闭
Socket socket=ss.accept();

//建立套接字对象之后,服务器要和客户端交换信息的话,需要建立输入输出流
InputStream ins=socket.getInputStream();
OutputStream out= socket.getOutputStream();

//服务器要发送给客户端的一串字符串
String s="丽丽";
//计算机在读消息是不能直接读取字符串而是一个一个的字节读,所以先把字符串读到一个字节数组中存放起来
byte[] bb=s.getBytes();
//通过输出流对象将字节数组的内容写出去
//out.write(bb);
out.write(s.getBytes("GBk"));

//以本台主机位服务器,要读取客户端发来的消息的话,要建立一个对象接收读出来的消息
int t=ins.read();
//若需要将读进去的字符串输出来,可用一个缓冲数组存放,当一条消息读完之后再把给消息以字符串的形式转出来
java.lang.StringBuffer str=new java.lang.StringBuffer();
//对于一条消息总该有个结束的标志,我们一遇到#结束,故用一个循环
while(t!='#'){
System.out.println("the char is"+t);
//接着读取下一个字节
t=ins.read();
//把字节打印出来

str.append((char)t);

}
     //把字节转换成字符串打印
String ims=str.toString();
System.out.println("the message is:"+ims);

}
} catch (IOException e) {

e.printStackTrace();
}  
       }
public static void main(String[] args) {
Sever se=new Sever();
se.setup(5678);

}

猜你喜欢

转载自2540611109.iteye.com/blog/2092027
今日推荐