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(); } } } |
java socket 单服务器多客户端实时通信的更多相关文章
- C#调用接口注意要点 socket,模拟服务器、客户端通信 在ASP.NET Core中构建路由的5种方法
C#调用接口注意要点 在用C#调用接口的时候,遇到需要通过调用登录接口才能调用其他的接口,因为在其他的接口需要在登录的状态下保存Cookie值才能有权限调用, 所以首先需要通过调用登录接口来保存c ...
- Java中的服务器与客户端的简单连接
Java中重点之一就是服务器与客户端的连接,因为是在同一台PC上,所以就设置服务器的地址为“localhost”,注意,我当时试着设置其他名称,但都不行,这个原因还请老司机告一下.另外还要注意,服务端 ...
- Socket通信——服务器和客户端相互通信
所谓socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄.应用程序通常通过"套接字"向网络发出请求或者应答网络请求. Socket和S ...
- JAVA Socket连接服务器时可能抛出的异常
1.UnknownHostException:host(非ip)无法识,就会报该异常,www.google.com.hk这个虽然也ping不通,但是不会报该错,因为他是一个确实存在的域名.他会报Con ...
- socket,模拟服务器、客户端通信
服务器代码: using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;u ...
- java socket 一个服务器对应多个客户端,可以互相发送消息
直接上代码,这是网上找的demo,然后自己根据需求做了一定的修改.代码可以直接运行 服务器端: package socket; import java.io.BufferedReader; impor ...
- java socket tcp(服务器循环检测)
刚才看了下以前写了的代码,tcp通信,发现太简单了,直接又摘抄了一个,运行 博客:http://blog.csdn.net/zhy_cheng/article/details/7819659 优点是服 ...
- Socket实现服务器与客户端的交互
连接过程: 根据连接启动的方式以及本地套接字要连接的目标,套接字之间的连接过程可以分为三个步骤:服务器监听,客户端请求,连接确认. (1)服务器监听:是服务器端套接字并不定位具体的客户端套接 ...
- socket模拟服务器,客户端下载东西(ftp)
服务端(ftp_server.py) import hashlib,socket,os server = socket.socket() server.bind(("localhost&qu ...
随机推荐
- JPA学习---第十二节:JPA中的联合主键
1.定义实体类,代码如下: (1).将联合主键放到一个类中,代码如下: package learn.jpa.entity; import java.io.Serializable; import ja ...
- windows和linux环境下制作U盘启动盘
新笔记本上,要装xp的系统,100%会破坏原有的Linux系统,因为安装xp的时候会自动覆盖硬盘的主引导扇区,这个扇区一旦被重写,那么原有的linux根本就启动不了. 要想玩linux和xp双系统,一 ...
- MySQL数据库远程连接开启方法
有时候需要远程连接mysql数据库,默认是不可以的,可以参考下面的方法,解决下. 1.登陆自己机器的MySQL数据库:mysql -uroot -p密码 设置root用户可以任意IP访问,代码如下(可 ...
- Netsharp快速入门(之9) 基础档案(工作区3 添加商品菜单,以及在产品中打开商品界面)
作者:秋时 杨昶 时间:2014-02-15 转载须说明出处 3.5.2 添加导航菜单 1.打开平台工具,插件和资源节点,选择创建导航菜单,打开创建向导 2.选择所属插件 3.选择在哪个分类下 ...
- Oracle VM VirtualBox 5.0 CentOS 6.4 共享文件夹
首先在主机(win7)的硬盘建立需要共享文件夹 例如 D:\share_test 然后虚拟机光驱加载Oracle VM VirtualBox安装目录的iso C:\Program Files\Ora ...
- HDU 5638 拓扑排序+优先队列
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5638 题意: 给你一个DAG图,删除k条边,使得能个得到字典序尽可能小的拓扑排序 题解: 把拓扑排序 ...
- 深入理解jQuery中live与bind方法的区别
本篇文章主要是对jQuery中live与bind方法的区别进行了详细的分析介绍,需要的朋友可以过来参考下,希望对大家有所帮助 注意如果是通过jq添加的层和对象一定要用live(),用其他的都不起作用 ...
- JS 学习笔记--2--变量的声明
1.ECMAScript 中规定所有的关键字.保留字.函数名.函数名.操作符等都是区分大小写的. 2.标识符:指变量.函数.属性的名字:标识符组成:以字母.下划线.$ 开头,其他字母可以含有数字, ...
- 【BZOJ】【1016】【JSOI2008】最小生成树计数
Kruskal/并查集+枚举 唉我还是too naive,orz Hzwer 一开始我是想:最小生成树删掉一条边,再加上一条边仍是最小生成树,那么这两条边权值必须相等,但我也可以去掉两条权值为1和3的 ...
- 【BZOJ】【1030】【JSOI2007】文本生成器
AC自动机/DP Orz ZYF 玛雅快要省选了,赶紧复(xue)习(xi)一下AC自动机…… 其实在AC自动机上DP并没有当初想的那么复杂……就是把DP的转移关系换成了AC自动机上的边而已(不过这题 ...