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

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

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

import javaioBufferedReader;

import javaioIOException;

import javaioInputStreamReader;

import javaioPrintWriter;

import javanetServerSocket;

import javanetSocket;

import javatextSimpleDateFormat;

import javautilArrayList;

import javautilDate;

import javautilList;

/

  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 = serveraccept();

Systemoutprintln(socketgetInetAddress()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 {

thisbufferedReader = new BufferedReader(new InputStreamReader(socket

getInputStream()));

thisprintWriter = new PrintWriter(socketgetOutputStream());

listadd(printWriter);

}

@Override

public void run() {

String string = null;

while (true) {

try {

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

string = bufferedReaderreadLine();

Systemoutprintln("客服端信息:" + string);

for(PrintWriter printWriter:list ){

printWriterwrite("服务器回显:" + string + "\r\n");

printWriterflush();

}

} catch (IOException e) {

}

}

}

}

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

import javaioBufferedReader;

import javaioIOException;

import javaioInputStreamReader;

import javaioPrintWriter;

import javanetSocket;

import javautilScanner;

public class Test4Client {

public static Object obj = new Object();

// 客服端的主入口

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

socketClient();

}

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

public static void socketClient() throws IOException {

Socket socket = new Socket("127001", 8888);

if (socketisConnected()) {

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

new writer(socket)start();

new read(socket)start();

} else {

Systemoutprintln("服务器未开启");

}

}

}

// 写入到通道的线程

class writer extends Thread {

@SuppressWarnings("unused")

private Socket socket;

private PrintWriter printWriter;

private Scanner scanner = new Scanner(Systemin);

private String str = null;

public writer(Socket socket) throws IOException {

thissocket = socket;

thisprintWriter = new PrintWriter(socketgetOutputStream());

}

@Override

public void run() {

scanneruseDelimiter("\r\n");

while (true) {

Systemoutprint("请输入信息:");

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

str = scannernext();

Systemoutprintln("我说:"+str);

printWriterwrite(str + "\r\n");

printWriterflush();

try {

Threadsleep(200);

} catch (InterruptedException e) {

eprintStackTrace();

}

}

}

}

// 从通道中读取的线程

class read extends Thread {

private Socket socket;

private BufferedReader bufferedReader;

private String str = null;

public read(Socket socket) throws IOException {

thissocket = socket;

thisbufferedReader = new BufferedReader(new InputStreamReader(socket

getInputStream()));

}

@Override

public void run() {

while (true) {

try {

str = bufferedReaderreadLine();

Systemoutprintln(str);

} catch (IOException e) {

}

try {

Threadsleep(200);

} catch (InterruptedException e) {

eprintStackTrace();

}

}

}

}

分布式是一种思想,范围很广,我得先知道它的诞生:

以前是一个数据库一个JSP就可以做一个应用了,后来随着业务复杂,我们开始分层,比如MVC之类的,再后来我们的数据越来越多了,比如有上亿的数据,这个时候我们一个数据库查询太慢了,就开始分库,这也算是分布式的一种。

还有比如我们的系统访问的人多了,比如双11,上千万人同时访问,我们的服务器(网站)支持不住了,这个时候就要部署到很多个服务器,每个服务器分摊请求,这也是分布式

当然随着业务扩大,我们得分业务了,比如注册登录的,物流的,卖东西的等等,不同的系统,但是各个系统之间进行协调,也算分布式一种

以上都算是分布式的来源,主要是解决压力过大,大家协同工作的,那么这就涉及到一些常用的东西,或者像你说的的技术

1你用N个数据库才放数据,至少CRUD方面就麻烦些了,得用cobar,tddl,mysql-proxy等协调

2服务器:你部署了很多服务器,肯定得用个东西来分发请求这些吧,nginx,apache等分发请求。

3你公司有很多系统,想很好的联系在一起,光用接口不满足了,得用一些JMS,像activemq,ons之类的来协调吧

4为了解决io问题,得加缓存吧,那么缓存对应上面的,也得分布式吧,就涉及memcache,redies等等

上面就简单的介绍了下分布式的东西,还有很多啦,这是常用的一些,希望你能慢慢来,不是一下子能理解得

Java实现聊天室可以采用网络编程中的Socket和ServerSocket技术来实现。具体实现步骤如下:

服务器端创建ServerSocket对象,并指定一个端口号来监听客户端的连接请求。

客户端创建Socket对象,并指定服务器端的IP地址和端口号来连接服务器。

服务器端通过ServerSocketaccept()方法等待客户端的连接请求,当有新的连接请求到达时,创建一个新的线程来处理该客户端的请求,并将该线程加入到线程池中。

客户端连接服务器后,通过SocketgetInputStream()方法获取输入流,并通过SocketgetOutputStream()方法获取输出流,向服务器发送消息或接收来自服务器的消息。

服务器端通过线程池中的线程来处理客户端的请求,服务器可以实现广播功能,将接收到的客户端消息转发给其他所有客户端,也可以实现点对点的私聊功能。

当客户端退出聊天室时,需要关闭相应的Socket连接,并通知其他客户端该客户端已经离开。

聊天室中的消息可以使用特定的格式进行编码和解码,以便服务器端和客户端可以正确地解析和处理消息。

需要注意的是,在实现聊天室时需要考虑线程安全、消息编解码、异常处理等问题,以确保聊天室的稳定和可靠性。同时,还需要进行充分的测试和优化,以提高聊天室的性能和用户体验。

DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
网站模板库 » 想用JAVA做一个服务器,请问怎么利用TCP和线程,实现多个客户端同时在线,能与服务器进行交互?

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情