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

那个客户端是自己输入账号密码注册的。感觉没有思路,求大神指点一下。。。
请提供思路和代码。

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

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) {

}
}

}
}

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

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

追答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();
}
}



}

温馨提示:内容为网友见解,仅供参考
第1个回答  2013-12-16
使用mina这个框架吧,很好用的

在Java中实现TCP协议编程中怎么传
Socket:客户端要与服务器建立连接,必须先创建一个Socket对象 常用构造方法 Socket(String host, int port):创建一个流套接字并将其连接到指定主机上的指定端口号。Socket(InetAddress address, int port):创建一个流套接字并将其连接到指定 IP 地址的指定端口号。服务器端程序调用ServerSocket类中的...

实现一款高可用的 TCP 数据传输服务器(Java版)
实现一款高可用的TCP数据传输服务器,可以利用Netty这款高性能、封装性良好且灵活的开源框架。Netty能够用于手写web服务器、TCP服务器等,支持丰富协议,如HTTP、HTTPS、WEBSOCKET,提供大量方法,可根据需求定制服务器。使用Netty编写TCP服务器或客户端时,可以自由设计数据传输协议、自定义编码规则和解码规则、...

搭建一个服务端一个客户端容易不
1、确定需求和技术栈 首先,需要确定你的应用程序的需求,以及选择合适的技术栈。这包括编程语言、数据库、服务器、框架等等。例如,对于一个简单的即时通讯应用程序,建议使用Node.js作为服务器端,使用JavaScript作为编程语言,使用Socket.IO作为实时通信框架。2、开始编码 准备好技术栈后,可以开始编写服务...

如何用Java实现Web服务器
(1) 连接:Web浏览器与Web服务器建立连接,打开一个称为socket(套接字)的虚拟文件,此文件的建立标志着连接建立成功。(2) 请求:Web浏览器通过socket向Web服务器提交请求。HTTP的请求一般是GET或POST命令(POST用于FORM参数的传递)。GET命令的格式为:GET 路径\/文件名 HTTP\/1.0 文件名指出所访...

求java网络高手,tcp最大连接问题
也就是说你写个程序,想要在1秒内连接超过50(假设)此连接,是不被允许的,你只能达到10个,我认为一般应用足够了,比如下载应用,1秒不够,稍后软件都会重试,并不会影响你的下载速度,像windows 2003这样的操作系统,是不会做此限制的,作为服务器,它的目标就是提高网络吞吐量。这样解释能明白否?

怎么实现java一对一聊天室?可以介绍一下吗
要实现 Java 的一对一聊天室,可以使用 Socket 编程实现基于 TCP 协议的通信。以下是一些大致的步骤:创建服务器端程序:创建一个服务器端程序,等待客户端的连接请求。在连接请求到来时,服务器会创建一个新的线程来处理这个连接请求。创建客户端程序:创建一个客户端程序,连接服务器端程序。在连接成功...

java服务器端与客户端的问题,我想在两台电脑上运行。比如另一台电脑上...
客户端说:" + msg); pw.println("我是服务器,你刚才说了:" + msg); pw.flush(); if (msg.equals("bye")) { break; } } pw.close(); ss.close(); } } catch (Exception e) { e.printStackTrace(); } } }客户端:import java.io.*; import java.net.*; public class ...

java是如何实现客服在线聊天功能的?
Java 实现在线客服聊天功能的具体方式会因具体实现技术和业务需求不同而异,以下是一个可能的实现思路:客户端和服务端之间的通信协议:在实现在线聊天功能的时候,需要考虑客户端和服务端之间的通信协议。可以使用 WebSocket 协议,这是一种全双工通信协议,支持客户端和服务端之间的实时通信。Java 提供了...

...客户端接收该信息并显示在屏幕上。用Java写
1、服务器端 import java.io.DataOutputStream;import java.io.IOException;import java.net.ServerSocket;import java.net.Socket;public class SocketServer { private static final int PORT = 8088; public static void main(String[] args) { ServerSocket server = null; try { ...

java如何多个service共用一个端口
不能同时使用一个端口。端口号的定义要加上相应的协议,比如TCP协议下有253端口,那么UDP协议下也有253端口,由于TCP\/IP传输层的TCP和UDP两个协议是两个完全独立的软件模块,因此各自的端口号也相互独立,两者并不冲突,所以说两个服务器共用一个端口并没有问题,前提是在不同的协议下。

相似回答