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是区分客户端与服务端 的。
比如: 打电话、 QQ\feiQ的文件传输、 迅雷下载....
(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 }