使用socket实现局域网聊天,写这个主要是为了深入理解socket与信息流在网络中的传送过程加深理解。
代码很简单分为两个类,一个服务器类,一个客户端,运行时分别启动两个线程一个负责接受另一个负责发送。
整体流程是 两台机器分别启动程序,一个选择主动连接 另一个选择被动接受,即可实现类似qq的聊天效果两个人可以同时发送消息。
注意的事,不要在同一台电脑上同时启动两个,这样会服务端和客户端的ip都是相同很有可能造成自己发送的消息自己接受到了,可以两台电脑或者虚拟机里面进行。
服务端:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
package com.server; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.ServerSocket; import java.net.Socket; import com.client.RunClient; public class RunServer { public static Socket socket= null ; /** * 建立服务器被动连接 * @throws IOException */ public void startServer() throws IOException { //服务器接收数据 ServerSocket serverSocekt= new ServerSocket( 8888 ); System.out.println( "服务器启动,等待连接..." ); //创建客户端线程 RunClient rc= new RunClient(); Thread rct= new Thread(rc); rct.start(); //阻塞线程 监听端口建立socket会话 RunServer.socket=serverSocekt.accept(); //获取输入留 InputStream is=socket.getInputStream(); //将字节输入流转换成字符输入流 InputStreamReader isr= new InputStreamReader(is); //将字符输入流装入带缓冲的输入流中 BufferedReader br= new BufferedReader(isr); String str= null ; while ((str=br.readLine())!= null ){ System.out.print( "输出信息:" +str); } socket.shutdownInput(); serverSocekt.close(); } } |
客户端:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
|
package com.client; import java.io.BufferedWriter; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.net.Socket; import java.net.UnknownHostException; import java.util.Scanner; import com.server.RunServer; public class RunClient implements Runnable { @Override public void run() { // TODO Auto-generated method stub Scanner input = new Scanner(System.in); System.out.println( "1、主动连接\n2、被动等待" ); String sign=input.next(); switch (sign) { case "1" : try { System.out.println( "输入服务器IP:" ); startClient(input.next()); } catch (Exception e) { e.printStackTrace(); } break ; case "2" : try { startClient(); } catch (Exception e) { e.printStackTrace(); } break ; default : break ; } } /** * 由已经建立的socket 进行连接反向连 * @throws Exception * @throws UnknownHostException */ public void startClient() throws Exception{ while ( true ){ try { if (RunServer.socket!= null ){ break ; } Thread.sleep( 1000 ); } catch (InterruptedException e) { e.printStackTrace(); } } // 与服务器建立连接 Socket socket= new Socket(RunServer.socket.getInetAddress().getHostAddress(), 8888 ); System.out.println( "连接建立成功..." ); //向服务器写入流 OutputStream os=socket.getOutputStream(); BufferedWriter bw= new BufferedWriter( new OutputStreamWriter(os)); Scanner input= new Scanner(System.in); while ( true ){ System.out.println( "输入信息:" ); bw.write(input.next()); bw.newLine(); bw.flush(); } } /** * 通过IP与服务器建立连接 * @throws Exception * @throws UnknownHostException */ public void startClient(String ip) throws Exception{ // 与服务器建立连接 Socket socket= new Socket(ip, 8888 ); System.out.println( "连接建立成功..." ); //向服务器写入流 OutputStream os=socket.getOutputStream(); BufferedWriter bw= new BufferedWriter( new OutputStreamWriter(os)); Scanner input= new Scanner(System.in); while ( true ){ bw.write(input.next()); bw.newLine(); bw.flush(); } } } |
main:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
package com.start; import com.server.RunServer; public class Go { public static void main(String[] args) throws Exception { // TODO Auto-generated method stub RunServer rs= new RunServer(); rs.startServer(); } } |
效果:我是用虚拟机加本机
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/qq_24209665/article/details/72782249