java socket 单服务器多客户端实时通信

想用JAVA做一个服务器,请问怎么利用TCP和线程,实现多个客户端同时在线,能与服务器进行交互?

服务器监听端口 做个无限循环 接到一个连接就创建一个通道线程,并将通道线程存储到一个list集合中


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

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader;

import java.io.PrintWriter;

import java.net.ServerSocket;

import java.net.Socket;

import java.text.SimpleDateFormat;

import java.util.ArrayList;

import java.util.Date;

import java.util.List;

/*

 * 4.用socket通讯写出多个客户端和一个服务器端的通讯,

 * 要求客户发送数据后能够回显相同的数据(回显功能)(实用TCP方式)。

 */

public class Test4Server {

    

    

    // 主入口

    public static void main(String[] args) throws IOException {

        scoketServer();

    }

    // 开启的tcp8888监听端口

    public static void scoketServer() throws IOException {

        ServerSocket server = new ServerSocket(8888);

        while (true) {

            // 未连通前线程阻塞,连通后开启一个socket通道线程后继续监听8888端口

            Socket socket = server.accept();

            System.out.println(socket.getInetAddress().getHostAddress()

                    "连接进入");

            new SocketThread(socket).start();

        }

    }

    

    

}

// 一个服务器端口中监听多个客服端通道线程

class SocketThread extends Thread {

//  所有通道写入流的集合

    private static List<PrintWriter> list =new ArrayList<PrintWriter>();

    

    private BufferedReader bufferedReader;

    private PrintWriter printWriter;

    public SocketThread(Socket socket) throws IOException {

        this.bufferedReader = new BufferedReader(new InputStreamReader(socket

                .getInputStream()));

        this.printWriter = new PrintWriter(socket.getOutputStream());

        list.add(printWriter);

    }

    @Override

    public void run() {

        String string = null;

        while (true) {

            try {

                // 服务器在通道中读到的信息回显给客服端

                string = bufferedReader.readLine();

                System.out.println("客服端信息:" + string);

                for(PrintWriter printWriter:list ){

                    printWriter.write("服务器回显:" + string + "\r\n");

                    printWriter.flush();

                }

            catch (IOException e) {

            }

        }

    }

}

客服端代码   可以用在局域网中用多台来连接测试


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

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader;

import java.io.PrintWriter;

import java.net.Socket;

import java.util.Scanner;

public class Test4Client {

    public static Object obj = new Object();

    // 客服端的主入口

    public static void main(String[] args) throws IOException {

        socketClient();

    }

    // 与服务器连通地址本机(127.0.0.1),局域网中其他机器是(服务器在局域网中的ip地址) 端口都是8888

    public static void socketClient() throws IOException {

        Socket socket = new Socket("127.0.0.1"8888);

        if (socket.isConnected()) {

            // 如果连接成功了就开启写和读的进程

            new writer(socket).start();

            new read(socket).start();

        else {

            System.out.println("服务器未开启");

        }

    }

}

// 写入到通道的线程

class writer extends Thread {

    @SuppressWarnings("unused")

    private Socket socket;

    private PrintWriter printWriter;

    private Scanner scanner = new Scanner(System.in);

    private String str = null;

    public writer(Socket socket) throws IOException {

        this.socket = socket;

        this.printWriter = new PrintWriter(socket.getOutputStream());

    }

    @Override

    public void run() {

        scanner.useDelimiter("\r\n");

        while (true) {

                System.out.print("请输入信息:");

                // 产生扫描器的线程阻塞

                str = scanner.next();

                System.out.println("我说:"+str);

                printWriter.write(str + "\r\n");

                printWriter.flush();

            try {

                Thread.sleep(200);

            catch (InterruptedException e) {

                e.printStackTrace();

            }

        }

    }

}

// 从通道中读取的线程

class read extends Thread {

    private Socket socket;

    private BufferedReader bufferedReader;

    private String str = null;

    public read(Socket socket) throws IOException {

        this.socket = socket;

        this.bufferedReader = new BufferedReader(new InputStreamReader(socket

                .getInputStream()));

    }

    @Override

    public void run() {

        while (true) {

                try {

                    str = bufferedReader.readLine();

                    System.out.println(str);

                catch (IOException e) {

                }

            try {

                Thread.sleep(200);

            catch (InterruptedException e) {

            

                e.printStackTrace();

            }

        }

    }

}

追问:

我是想在一个JFrame界面弄2个按钮,“启动服务器”“关闭服务器”

启动服务器之后,我做了一个这样的界面,希望能在左边的用户信息里显示连接到服务器的用户,右边的editorPane里显示IP,用户名,密码。

你给的代码可以运行但是没有在界面里面,能不能再详细介绍一下。。想了一下午都不知道怎么把那些东西加到这个界面里面去。。。TUT

追答:


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

public class Test4Server {

    

    

    // 主入口

    public static void main(String[] args) throws IOException {

        scoketServer();

    }

    // 开启的tcp8888监听端口

    public static void scoketServer() throws IOException {

        ServerSocket server = new ServerSocket(8888);

        

        

        //这里开启你的服务端界面

        

        while (true) {

            // 未连通前线程阻塞,连通后开启一个socket通道线程后继续监听8888端口

            Socket socket = server.accept();

//          这里将连接进来的 ip地址  显示在你的 服务端界面列表中: socket.getInetAddress().getHostAddress()

            System.out.println(socket.getInetAddress().getHostAddress()

                    "连接进入");

            new SocketThread(socket).start();

        }

    }

    

    

}

时间: 2024-10-26 00:50:46

java socket 单服务器多客户端实时通信的相关文章

JAVA Socket连接服务器时可能抛出的异常

1.UnknownHostException:host(非ip)无法识,就会报该异常,www.google.com.hk这个虽然也ping不通,但是不会报该错,因为他是一个确实存在的域名.他会报ConnectionException 2.ConnectException:一般是ip或者host或者域名是通的,但是端口不通,就会报该错.另外如果域名存在,但是网络如果做了限制,也会报该错的.如果服务端做了连接数的限制,如果客户端同时连接的过多的时候也会报该错. 设置服务端连接数的构造方法如下:pub

Java socket模拟HTTP协议客户端之POST请求

相比于GET请求,POST报文多了如下几个要素: 1,Content-Length,这个是上送报文的长度,以字节为单位 2,Content-Type,这主要是涉及到报文的格式和字符集. 3,就是主报文 主类SimpleHttpPost: package com.zws.http; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.InetSock

java 网络编程 TCP协议 java 服务器和客户端 java socket编程

一个 HelloWord 级别的 Java Socket 通信的例子.通讯过程:        先启动 Server 端,进入一个死循环以便一直监听某端口是否有连接请求.然后运行 Client 端,客户端发出连接请求,服务端监听到这次请求后向客户端发回接受消息,连接建立,启动一个线程去处理这次请求,然后继续死循环监听其他请求.客户端输入字符串后按回车键,向服务器发送数据.服务器读取数据后回复客户端数据.这次请求处理完毕,启动的线程消亡.如果客户端接收到 "OK" 之外的返回数据,会再次

Java Socket应用(六)——服务器响应客户端

转载请注明:http://blog.csdn.net/uniquewonderq 通过输入流来读取客户端信息,相应的时候通过输出流来实现. 服务端类的代码: package com.test; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; imp

Java 利用 Socket 实现服务器客户端聊天

Socket是网络编程中最基本的通信接口,常用的网络辅助类,比如URL等之类,其底层还是基于Socket来实现的. 而Socket,形象来说,就是连接通信的两端,比如这样 S<==>S,中间的通道就是网络了,而简单地利用Socket,我们就可以来实现一个简单的聊天功能 具体效果看下图: 这只是在本地中试用的效果,如果加上UI界面,其实就可以做成一个聊天的小应用了. 1. Server 端主要是利用ServerSocket的accept方法来等待客户端的连接,如果客户一直没有连接,则会在这里等待

一个 Java 的 Socket 服务器和客户端通信的例子

http://blog.csdn.net/defonds/article/details/7971259 多个客户端对应一个服务端的通信的一个小例子.  服务端和客户端代码: public class Server { /** * 监听的端口 */ public static final int PORT = 12345; public static void main(String[] args) { System.out.println("服务器启动>>>>>&

[Java聊天室服务器]实战之八 读写循环(客户端)

前言 学习任何一个稍有难度的技术,要对其有充分理性的分析,之后果断做出决定---->也就是人们常说的"多谋善断":本系列虽然涉及的是socket相关的知识,但学习之前,更想和广大程序员分享的是一种心境:学习是一个循序渐进的过程,心态应该随时调节,保持戒骄戒躁的状态.比如最近在看网易公开课MIT<算法导论>,老师提到,学习算法之前要计算机数学+离散数学+概率论等课程的知识,所以一直学不好算法的程序员不妨从基础入手,这都是中国式教育惹的祸啊!(此处省略一万字......)

java socket 客户端和服务端通信

1.采用阻塞式readUTF():长连接 2.java socket的3个主要方面如下 1)accept 阻塞,直到接受到一个连接,并返回一个客户端对象实例 2)getInputStream() 3)getOutputStream() 客户端代码: public class ClientSocket { public static final String IP="10.100.63.18"; public static final int PORT=667; public stati

[Java聊天室服务器]实战之七 客户端类

前言 学习任何一个稍有难度的技术,要对其有充分理性的分析,之后果断做出决定---->也就是人们常说的"多谋善断":本系列虽然涉及的是socket相关的知识,但学习之前,更想和广大程序员分享的是一种心境:学习是一个循序渐进的过程,心态应该随时调节,保持戒骄戒躁的状态.比如最近在看网易公开课MIT<算法导论>,老师提到,学习算法之前要计算机数学+离散数学+概率论等课程的知识,所以一直学不好算法的程序员不妨从基础入手,这都是中国式教育惹的祸啊!(此处省略一万字......)