socket编程(一)

依据TCP协议,在C/S架构的通讯过程中,客户端和服务器的Socket动作如下

服务器:

1. 在服务器,用一个端口来实例化一个 ServerSocket对象。此时,服务器就可以这个端口时刻监听从客户端发来的连接请求。

2.调用ServerSocket的accept方法,开始监听连接从端口上发来的连接请求。   

3.利用accept方法返回的客户端的Socket对象,进行读写IO的操作

通讯完成后,关闭打开的流和Socket对象。

[java]
  1. public class Server {  
  2.     //端口号  
  3.     public static int PORTNO = 8888;  
  4.     public static void main(String[] args) throws IOException {  
  5.         //初始化ServerSocket对象,承担服务器端监听连接和提供通讯服务的功能  
  6.         ServerSocket s = new ServerSocket(PORTNO);  
  7.         System.out.println("服务启动"+s);  
  8.         //调用ServerSocket对象的accept方法,监听从客户端的连接请求。  
  9.         //当完成调用accept方法后,整段服务器端代码将会阻塞在这里,直到客户端发来connect请求  
  10.         //当客户端发来connect请求,或是通过构造函数直接把客户端的socket对象连接到服务器端后,  
  11.         //阻塞于此的代码将会继续运行。此时服务器端将会根据accept方法的执行结果,用一个socket对象来描述客户端的连接句柄  
  12.         Socket socket = s.accept();  
  13.           
  14.         try {  
  15.             System.out.println("accept the client:"+socket);  
  16.             //创建in out对象,分别用来传输和接收通讯时的数据流  
  17.             BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));  
  18.             PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),true);  
  19.             //创建一个while(true)的死循环,在循环里通过in.readLine()方法读取从客户端发送过来的IO流,并打印出来,如果读到的字符串是“byebye”,那么退出循环  
  20.             while(true){  
  21.                 String str = in.readLine();  
  22.                 if(str.endsWith("byebye")){  
  23.                     break;  
  24.                 }  
  25.                 System.out.println("in service reveived the info:"+str);  
  26.                 out.println(str);  
  27.             }  
  28.         } catch (Exception e) {  
  29.             // TODO Auto-generated catch block  
  30.             e.printStackTrace();  
  31.         }finally{  
  32.             System.out.println("close the server socket and the io.");  
  33.             //关闭描述客户端的连接句柄socket对象和ServerSocket类型的s对象  
  34.             socket.close();  
  35.             s.close();  
  36.         }  
  37.     }  
  38. }  

客户端:

1.用服务器的IP地址和端口号实例化Socket对象。

2.调用connect方法,连接到服务器上。

3.将发送到服务器的IO流填充到IO对象里,比如BufferedReader/PrintWriter

4.利用Socket提供的getInputStream和getOutputStream方法,通过IO流对象,向服务器发送数据流。

5. 通讯完成后,关闭打开的IO对象和Socket。

[java]
  1. public class Client {  
  2.     static String CLIENTNAME = "mike";  
  3.     //定义通讯端口号,这里给出的端口号必须和服务器端的一致  
  4.     public static int PORTNO = 8888;  
  5.     public static void main(String[] args) throws IOException {  
  6.         //根据地址信息localhost创建一个InetAddress类型的对象addr。  
  7.         //我们把客户端和服务器端的代码都在本机运行,所以同样可以用"127.0.0.1"字符串,来创建inetaddress对象  
  8.         InetAddress addr = InetAddress.getByName("localhost");  
  9.         //根据addr和端口号信息,创建一个socket类对象,该对象用来同服务器端的Serversocket类型对象交互,共同完成C/S通讯流程  
  10.         Socket socket = new Socket(addr,PORTNO);  
  11.         try {  
  12.             System.out.println("socket = "+socket);  
  13.             //同样创建in和out两类IO句柄,用来向服务器端发送和接收数据流  
  14.             BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));  
  15.             PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);        
  16.             //通过out对象像服务器端发送"hello server,i am ..."字符串。发送后,同样可以用in句柄,接收从服务器端的消息  
  17.             out.println("hello server,i am "+CLIENTNAME);  
  18.             String str= in.readLine();  
  19.             System.out.println(str);  
  20.             //利用out对象,发送“byebye”字符串,用以告知服务器端,本次通讯结束  
  21.             out.println("byebye");  
  22.         } catch (Exception e) {  
  23.         }finally{  
  24.             System.out.println("close the client socket and the io.");  
  25.             //关闭socket对象,断开同服务器端的连接  
  26.             socket.close();  
  27.         }  
  28.     }  
  29. }  
  30.   
  31. 先开启服务器端的程序再开启客户端,如果这个步骤做反的话,客户端程序会应找不到服务器端而报异常 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值