网络编程(学习整理)---1--(Tcp)实现简单的控制台聊天室

1、简单的聊天室(控制台):

    功能实现:

      客户端和服务端的信息交流:

2、牵扯到的知识点:

   这个我大概说一下,详细后面见代码!

    

   1) 网络通讯的三要素
    1. IP
    2. 端口号。
    3. 协议

     2) InetAddress(IP类)

    常用的方法:
      getLocalHost(); 获取本机的IP地址
      getByName("IP或者主机名") 根据一个IP地址的字符串形式或者是一个主机名生成一个IP地址对象。 (用于获取别人的IP地址对象)

      getHostAddress() 返回一个IP地址的字符串表示形式。
      getHostName() 返回计算机的主机名

  

     3) 端口号是没有类描述的。
      端口号的范围: 0~65535
      从0到1023,系统紧密绑定于一些服务。
      1024~65535 我们可以使用....

     4) 网络通讯的协议:
      udp通讯协议

      tcp通讯协议。

   5)TCP
      (1)TCP通讯协议特点:
         1. tcp是基于IO流进行数据 的传输 的,面向连接。
        2. tcp进行数据传输的时候是没有大小限制的。
        3. tcp是面向连接,通过三次握手的机制保证数据的完整性。 可靠协议。
        4. tcp是面向连接的,所以速度慢。
        5. tcp是区分客户端与服务端 的。
        比如: 打电话、 QQfeiQ的文件传输、 迅雷下载....


      (2) tcp协议下的Socket:
        Socket(客户端) , tcp的客户端一旦启动马上要与服务端进行连接。
        ServerSocket(服务端类)

      (3) tcp的客户端使用步骤:
        1. 建立tcp的客户端服务。
        2. 获取到对应的流对象。
        3. 写出或读取数据
        4. 关闭资源。 

3、下面直接贴上我测试的代码:

  客户端代码:  

 1 package cn.chating;
 2 
 3 import java.io.BufferedReader;
 4 import java.io.BufferedWriter;
 5 import java.io.IOException;
 6 import java.io.InputStreamReader;
 7 import java.io.OutputStreamWriter;
 8 import java.net.Socket;
 9 import java.net.UnknownHostException;
10 
11 /**
12  * 聊天:客户端
13  * @author 小风微灵
14  *
15  */
16 public class ChatClient {
17 
18     
19     public static void main(String[] args) throws Exception {
20         
21         //建立客户端
22         Socket client=new Socket("192.168.9.122",22222);
23         /***********************************io start **************************************/        
24         //得到输入的字符流对象
25         BufferedReader reader=new BufferedReader(new InputStreamReader(client.getInputStream()));
26         
27         //得到输出的字符流对象
28         BufferedWriter writer=new BufferedWriter(new OutputStreamWriter(client.getOutputStream()));
29         
30         //得到键盘输入流
31         BufferedReader keywrite=new BufferedReader(new InputStreamReader(System.in));
32         
33         String content=null;
34         
35         String get=null;
36         
37         System.err.println("请输入要发送的信息:");
38         
39         while((content=keywrite.readLine())!=null){    //向服务端发送信息
40             
41             writer.write("客户端说:"+content);    
42             writer.newLine();    //换行
43             writer.flush();        //发送
44             
45             //接收服务端的信息
46             if((get = reader.readLine())!=null){                
47                 System.out.println("服务端说:"+get);
48             }
49         }
50         /***********************************io end **************************************/        
51         //关闭资源
52         client.close();
53     }
54 
55 }

  服务端代码: 

 1 package cn.chating;
 2 
 3 import java.io.BufferedReader;
 4 import java.io.BufferedWriter;
 5 import java.io.InputStream;
 6 import java.io.InputStreamReader;
 7 import java.io.OutputStreamWriter;
 8 import java.net.ServerSocket;
 9 import java.net.Socket;
10 
11 /**
12  * 聊天:
13  *     一问一答的服务端
14  * @author 小风微灵
15  *
16  */
17 public class ChatServer {
18 
19 public static void main(String[] args) throws Exception{
20         
21         //建立socket服务端
22         ServerSocket server = new ServerSocket(22222);
23         
24         //阻塞型的方法, 等待接收客户端的 连接
25         Socket rsocket =server.accept();
26         
27 /***********************************io start **************************************/        
28         //读取已连接的客户端发送的信息   输入字节流
29         InputStream is = rsocket.getInputStream();
30         
31         //得到输入的缓冲字符流对象
32         BufferedReader reader = new BufferedReader(new InputStreamReader(is));
33         
34         //得到输出的字符流对象
35         BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(rsocket.getOutputStream()));        
36         
37         //得到键盘的输入流
38         BufferedReader keyReader = new BufferedReader(new InputStreamReader(System.in));
39         
40         String content = null;
41         
42         String send = null;
43         
44         while((content = reader.readLine()) != null){
45             
46             System.out.println("服务端接收到:"+content);
47             
48             //键盘挂起,  一次
49             if((send = keyReader.readLine()) != null){  
50                 writer.write(send);
51                 writer.newLine();//换行
52                 writer.flush();//发送
53             }
54         }
55 /***********************************io end **************************************/        
56         
57         //关闭资源
58         rsocket.close();
59     }
60 
61 }
原文地址:https://www.cnblogs.com/newwind/p/5658531.html