好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

java socket实现局域网聊天

使用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实现局域网聊天的详细内容...

  阅读:16次