코드는 매우 간단하며 서버 클래스와 클라이언트의 두 클래스로 구분됩니다. 실행 시 두 개의 스레드가 각각 시작되며, 하나는 수신을 담당하고 다른 하나는 전송을 담당합니다.
전체 프로세스는 두 대의 기계가 별도로 프로그램을 시작하고, 하나는 적극적으로 연결하고 다른 하나는 수동적으로 수락하도록 선택하여 QQ와 같은 채팅 효과를 얻을 수 있으며 두 사람이 동시에 메시지를 보낼 수 있다는 것입니다.
주의하세요. 동일한 컴퓨터에서 동시에 시작하지 마세요. 이렇게 하면 서버와 클라이언트 IP가 동일해져서 보내는 메시지가 직접 수신될 수 있습니다. 두 대의 컴퓨터 또는 가상 머신.
서버:
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(); } }
클라이언트:
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:
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(); } }
효과: 가상 머신과 로컬 머신을 함께 사용합니다
위 내용은 Java 소켓을 사용하여 LAN 채팅을 구현하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!