使用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
查看更多关于java socket实现局域网聊天的详细内容...