zoukankan      html  css  js  c++  java
  • 网络编程(学习整理)---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 }
  • 相关阅读:
    sourceInsight4 破解笔记(完美破解)
    notepad++ 查找引用(Find Reference)(适用于c c++及各类脚本比如lua、python等)
    notepad++ 插件推荐——快速定位文件
    WebRTC开源项目一览之二
    编译最新版webrtc源码和编译好的整个项目10多个G【分享】
    Neo4j中实现自定义中文全文索引
    NEO4J -模糊查询
    neo4j数据库迁移---------Neo4j数据库导入导出的方法
    使用neo4j图数据库的import工具导入数据 -方法和注意事项
    neo4j采坑记
  • 原文地址:https://www.cnblogs.com/newwind/p/5658531.html
Copyright © 2011-2022 走看看