java:多线程与Socket结合的简单示例

news/2024/7/5 10:13:58
java:多线程与Socket结合的简单示例


import java.io.*;
import java.net.*;
public class MyServer {
public static void main(String[] args) throws IOException {
ServerSocket server = new ServerSocket(5678);
Socket client = server.accept();
BufferedReader in = new BufferedReader(new InputStreamReader(client
.getInputStream()));
PrintWriter out = new PrintWriter(client.getOutputStream());
while (true) {
String str = in.readLine();
System.out.println(str);
out.println("has receive...");
out.flush();
if (str.equals("end"))
break;
}
client.close();
}
}

import java.net.*;
import java.io.*;
public class Client {
static Socket server;
public static void main(String[] args) throws Exception {
server = new Socket(InetAddress.getLocalHost(), 5678);
BufferedReader in = new BufferedReader(new InputStreamReader(server
.getInputStream()));
PrintWriter out = new PrintWriter(server.getOutputStream());
BufferedReader wt = new BufferedReader(new InputStreamReader(System.in));
while (true) {
String str = wt.readLine();
out.println(str);
out.flush();
if (str.equals("end")) {
break;
}
System.out.println(in.readLine());
}
server.close();
}
}
客户机代码则是接受客户键盘输入,并把该信息输出,然后输出"end"用来做退出标识。这个程序只是简单的两台计算机之间的通讯。如果是多个客户同时访问一个服务器呢?你可以试着再运行一个客户端,结果是会抛出异常的。那么多个客户端如何实现呢? 其实,简单的分析一下,就可以看出客户和服务通讯的主要通道就是Socket本身。而服务器通过accept方法就是同意和客户建立通讯。这样当客户建立Socket的同时。服务器

也会使用这一根连线来先后通讯。那么既然如此只要我们存在多条连线就可以了。那么我们的程序可以变为如下:

import java.io.*;
import java.net.*;
public class MyServer {
public static void main(String[] args) throws IOException {
ServerSocket server = new ServerSocket(5678);
while (true) {
Socket client = server.accept();
BufferedReader in = new BufferedReader(new InputStreamReader(client
.getInputStream()));
PrintWriter out = new PrintWriter(client.getOutputStream());
while (true) {
String str = in.readLine();
System.out.println(str);
out.println("has receive...");
out.flush();
if (str.equals("end"))
break;
}
client.close();
}
}
}
这里仅仅只是加了一个外层的While循环。这个循环的目的就是当一个客户进来就为它分配一个Socket直到这个客户完成一次和服务器的交互,这里也就是接受到客户的"end"消息。那么现在就实现了与多客户之间的交互了。但是问题又来了,这样做虽然解决了多客户,可是是排队执行的。也就是说当一个客户和服务器完成一次通讯之后下一个客户才可以进来和服务器交互。无法做到同时服务。那么要如何才能同时达到既能相

互之间交流又能同时交流呢?很显然这是一个并行执行的问题了。所以线程是最好的解决方案。那么下面的问题是如何使用线程。首先要做的事情是创建线程并使得其可以和网络连线取得联系。然后由线程来执行刚才的操作。要创建线程要么直接继承Thread,要么实现Runnable接口,要建立和Socket的联系只要传递引用就可以了。而要执行线程就必须重写run方法。而run方法所做的事情。就是刚才单线程版本main所做的事情。因此我们的程序变成了这样:

import java.net.*;
import java.io.*;
public class MultiUser extends Thread {
private Socket client;
public MultiUser(Socket c) {
this.client = c;
}
public void run() {
try {
BufferedReader in = new BufferedReader(new InputStreamReader(client
.getInputStream()));
PrintWriter out = new PrintWriter(client.getOutputStream());
// Mutil User but can't parallel
while (true) {
String str = in.readLine();
System.out.println(str);
out.println("has receive...");
out.flush();
if (str.equals("end"))
break;
}
client.close();
} catch (IOException ex) {
} finally {

}
}
public static void main(String[] args) throws IOException {
ServerSocket server = new ServerSocket(5678);
while (true) {
// transfer location change Single User or Multi User
MultiUser mu = new MultiUser(server.accept());
mu.start();
}
}
}
我的类直接从Thread类继承了下来。并且通过构造函数传递引用和客户Socket建立了联系。这样每个线程就有了一个通讯管道。同样我们可以填写run方法。把之前的操作交给线程来完成。这样多客户并行的Socket就建立起来了。

http://www.niftyadmin.cn/n/3855213.html

相关文章

cocos2d-x开发之sqlite数据库加密研究(sqlite3.c代码浅析1)

SQLITE版本3.7.15.1中的sqlite3.c长达13万多行,要细致分析这个文件可不容易。但是,这个文件是由许多个.H和.C文件组合而成,正如此文件开始的注释中所述:/**********************************************************************…

Openstack(两控制节点+四计算节点)-4 模拟控制节点宕机

为什么80%的码农都做不了架构师?>>> 双控制节点通过heartbeatpacemaker监控相关服务,所以须在两台控制节点上先安装heartbeat软件,安装过程可参照: http://my.oschina.net/guol/blog/90128 pacemaker主要是对控制节点…

行业网站优化一般步骤

关于行业网站优化我写的只是 SEO 的操作细则并非运营思路,运营思路将在后期引入, 这个行业网站优化细则我花几天的时间进行梳理结构和整理, 希望大家提意见, 同时谢谢长 期支持本站的 SEOer。 行业站的优势在于其海量的信息&#…

java Socket多线程服务器源代码介绍

java Socket多线程服务器源代码介绍java Socket多线程在我们进行相关学习的时候需要注意不断出现的问题,下面我们就来看看在java Socket多线程中服务器的代码编写。java Socket多线程需要我们不断的学习,在学习的时候我们就会发现在服务器的配置上有不少…

Java Socket 编程——多线程网络聊天程序

Java Socket 编程——多线程网络聊天程序 首先,进行服务端的编程,作为服务端,编程主要按下面几个步骤进行:// 1. 创建socketServerSocket ss new ServerSocket(PortNumber);Socket s ss.accept(); //监听器,产生阻塞…

SQL Server 跨服务器 不同数据库之间复制表的数据的方法:

不同数据库之间复制表的数据的方法: 当表目标表存在时: insert into 目的数据库..表 select * from 源数据库..表 当目标表不存在时: select * into 目的数据库..表 from 源数据库..表 --如果在不同的SQL之间: insert into openrowset(sql…

Java多线程-----Socket通信

Java多线程-----Socket通信程序分Server和Client服务器端打开侦听的端口,一有客户端连接就创建两个新的线程来负责这个连接一个负责客户端发送的信息(ClientMsgCollectThread 类),另一个负责通过该Socket发送数据(ServerMsgSendThread &#…

算法学习-哈希表

之前在大学学习数据结构的时候,学过数组和链表。数组的优点就是可以直接定位,速度快,但是缺点就是插入删除,效率就慢了很多。链表的可以快速的插入删除,但是不能直接定位,需要遍历才可以。他们使用在不同的…