当前位置:首页 >> 季节养生

基于Socket的Java网络编程集粹

2020-06-13 20:27 来源:莱西养生网

其实,简单的分析一下,就可以看出客户和服务通讯的主要通道就是Socket本身,而服务器通过accept方法就是同意和客户建立通讯.这样当客户建立Socket的同时。服务器也会使用这一根连线来先后通讯,那么既然如此只要我们存在多条连线就可以了。那么我们的程序可以变为如下:

服务器:

import .*;

import .*;

public class MyServer {

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

ServerSocket server=new ServerSocket(5678);

while(true){

Socket client=cept();

BufferedReader in=new BufferedReader(new InputStreamReader(tInputStream()));

PrintWriter out=new PrintWriter(tOutputStream());

while(true){

String str=adLine();

intln(str);

intln("has receive....");

ush();

if(uals("end"))

break;

}

ose();

}

}

}

这里仅仅只是加了一个外层的While循环,这个循环的目的就是当一个客户进来就为它分配一个Socket直到这个客户完成一次和服务器的交互,这里也就是接受到客户的"End"消息.那么现在就实现了多客户之间的交互了连叫了三趟。但是.问题又来了,这样做虽然解决了多客户,可是是排队执行的。也就是说当一个客户和服务器完成一次通讯之后下一个客户才可以进来和服务器交互,无法做到同时服务,那么要如何才能同时达到既能相互之间交流又能同时交流呢?很显然这是一个并行执行的问题了。所以线程是最好的解决方案。

那么下面的问题是如何使用线程.首先要做的事情是创建线程并使得其可以和络连线取得联系。然后由线程来执行刚才的操作,要创建线程要么直接继承Thread要么实现Runnable接口,要建立和Socket的联系只要传递引用就可以了.而要执行线程就必须重写run方法,而run方法所做的事情就是刚才单线程版本main所做的事情,因此我们的程序变成了这样:

import .*;

import .*;

public class MultiUser extends Thread{

private Socket client;

public MultiUser(Socket c){

ient=c;

}

public void run(){

try{

BufferedReader in=new BufferedReader(new InputStreamReader(tInputStream()));

PrintWriter out=new PrintWriter(tOutputStream());

//Mutil User but can parallel

while(true){

String str=adLine();

intln(str);

intln("has receive..提供赌博工具和茶饭..");

ush();

if(uals("end"))

break;

}

ose();

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

art();

}

}

}

我的类直接从Thread类继承了下来.并且通过构造函数传递引用和客户Socket建立了联系,这样每个线程就有了。一个通讯管道.同样我们可以填写run方法,把之前的操作交给线程来完成,这样多客户并行的Socket就建立起来了。

以上的代码使用的是

BufferedReader in=new BufferedReader(new InputStreamReader(tInputStream()));

PrintWriter out=new PrintWriter(tOutputStream());

还有一种方法是使用

DataInputStream isFromClient = new DataInputStream(tInputStream());

DataOutputStream osToClient = new DataOutputStream(tOutputStream());

关于这两种输入输出流的不同,我也只知道前一种对字符串支持比较好,后面对于读取一个字符串需要处理,但是可以支持很多种类型的输出。对于传递字符串而言前一种应该是很好的选择了。

查看本文来源

初期脑梗怎么治疗
威海白癜病医院
淄博治疗白斑病费用
相关阅读
大白熊犬呕吐拉血是什么毛病位置

大白熊犬昨晚吃多了,今早呕吐,拉稀,之后拉血,是什么毛病琪步莎:大白熊犬价格吃多了一般会把食物吐出,轻度拉稀,或者禁食一天一般情况会好,但如果拉稀严重甚至拉血,那有可能会是其他疾病,还是带...

大白熊犬后腿严重外八字需不需要治疗位置

大白熊犬从小后腿站立玩耍时就叉腿.看起来外八.走路和跑步时都正常.严重吗.需不需要治疗?淡淡的看:这是小狗的出生时就带的,属于先天性疾病。大白熊犬价格小脑发育不良。像楼上所说,补钙可以缓解病症,...

大白熊犬可以长多大大白熊犬体型较大位置

大白熊犬可以长多大,大白熊是一种体型比较大的狗狗,虽然它们的性格很温顺,也是非常优秀的宠物犬,不过该犬是不太适合在室内饲养的大型犬,如果家里条件不符合的话最好还是不要饲养比较好。不过是什么...

大白熊犬发情的一些事宜介绍位置

当我们饲养了一只可爱的大白熊犬时,狗狗的身体健康与生理健康也是我们最关心的事情。每当到了春秋两季的时候,就是大白熊犬发情的期,这一时期主人们一定要多加注意,一不留神可能你的大白熊犬就会怀孕...

大白熊犬剃毛后不喜欢露肚子睡觉了怎么回事位置

我家大白熊犬以前最喜欢的就是仰着睡,每次还喜欢仰着我给它按摩小肚子,前几天带它去剃了胎毛后(剃光拉~那个悔呀)不愿意露小肚子了,现在大白熊犬价格都是缩成一团睡,每次我按小肚子它也不愿意,一...

大白熊犬两天没拉便便了怎么回事位置

医院检查细小试纸在T2的位置,医生说要再观察,开了5针血清。 大白熊犬体温正常,精神也还可以,喝水,吃的不多(原主人应该喂的人吃的食物,现在是狗粮+狗罐头),大白熊犬尿尿正常,但是到现在也没便便...

友情链接