多个client与一个server端通信的问题

上篇博文主要是讲的关于client与server端的通信问题。在上篇博文中当我们仅仅有一个client訪问我们的server时是能够正常执行的,可是当我们有多个client訪问我们的server时。我们的代码就不能正常工作了。

而在现实中。我们是非常少有一个server仅仅供一个client訪问的,此篇博文就是来解决多个client訪问我们server端的问题

解决方法:

  • 用一个多线程就能够解决

实现代码例如以下:

第一个:client的代码例如以下:

package org.wrh.socketserver;

import java.io.FileInputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket; public class MyClient { public static void main(String[] args) throws Exception {
//第一步:创建clientSocket
Socket s=new Socket("192.168.1.107",4567);
//第二步:读取向server端发送的数据文件
FileInputStream fis=new FileInputStream("d:\\100.txt");
//第三步:获取Socket输出流
OutputStream os=s.getOutputStream(); byte[] buf=new byte[1024];
int len;
while((len=fis.read(buf))!=-1){
os.write(buf, 0, len); }
//刷新一下缓冲区的数据
os.flush();
//告诉server。我的数据已经发送完了
s.shutdownOutput(); //将server返回的数据读取出来
InputStream is=s.getInputStream();
byte[] buf_in=new byte[1024];
int len_in=is.read(buf_in);
System.out.println(new String(buf_in,0,len_in)); fis.close();
os.close();
is.close();
s.close(); } }

第二个:server端的代码例如以下

package org.wrh.socketserver;

import java.net.ServerSocket;
import java.net.Socket; public class MyServer { public static void main(String[] args) throws Exception {
//第一步:建立server端Socket
ServerSocket ss=new ServerSocket(4567);
while(true){
//第二步:获取client
Socket socket=ss.accept();
/*
* 当我们考虑多个client訪问server端的时候,我们就须要考虑多线程的问题
* */
new Thread(new TaskWork(socket)).start();
} } }

当中,线程类的代码例如以下

package org.wrh.socketserver;

import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket; public class TaskWork implements Runnable {
Socket socket;
public TaskWork(Socket socket){
this.socket=socket;
}
@Override
public void run() {
// TODO Auto-generated method stub
int count=0;
/*
* 获取client的ip地址
* */
String ip=socket.getInetAddress().getHostAddress();
System.out.println(ip+"....connected");
//第三步:获取Socket的输入流,对client发送来的数据进行读取
try{
InputStream is=socket.getInputStream(); /*
*读取数据,并 将数据写入到文件里
* */
File dir=new File("d:\\wu");
if(!dir.exists()){
dir.mkdirs(); } File file=new File(dir,ip+".txt");
/*
* 假设在server端此文件已经存在的处理办法
* */
if(file.exists()){
file=new File(dir,ip+"("+(++count)+").txt");
} FileOutputStream fos=new FileOutputStream(file); byte[] buf=new byte[1024];
int len=0;
while((len=is.read(buf))!=-1){
fos.write(buf, 0, len); }
fos.flush(); //给client一个反馈信息
OutputStream os=socket.getOutputStream();
os.write("收到数据".getBytes()); //以下为关闭各种要关闭的资源
fos.close();
is.close();
os.close();
socket.close(); }
catch(Exception e){
e.printStackTrace();
} } }

假设上篇博文的代码你弄懂了。这篇博文的代码理解起来就相当easy啦

说明

  • 上面的代码中。主线程一直在等待这client的连接,仅仅要一有client连接进来。就会开启一个子线程来执行对应的操作。

多个client与一个server端通信的问题的更多相关文章

  1. Python的XMLRPC机制:实现跨进程间、client/server端通信

    SimpleXMLRPCServer模块式python语言的一个基于 xml 格式的进程间通信的基础框架. SimpleXMLRPCServer是一个单线程的服务器,这意味着,如果几个客户端同时发出多 ...

  2. 上机题目(0基础)- Java网络操作-Socket实现client和server端通信(Java)

    非常多刚開始学习的人对于java网络通信不太熟悉.对相关概念也不太明确,这里我们主要实现一下socket通信,socket通信在java中应用十分广泛.比如QQ和MSN等都是基于socket通信的,什 ...

  3. Socket实现client和server端通信(Java)(转)

    转自: https://blog.csdn.net/yayun0516/article/details/50819147 https://www.jianshu.com/p/2d4f223f1462 ...

  4. 上机题目(0基础)- Java网络操作-Socket实现client和server端通信二(Java)

    上一节实现了client像server端发送请求.本节将实现server端向client回传信息.实现原理非常easy,在原来的基础上.在server端实现输出流,在client实现输入流就可以,详细 ...

  5. 使用Netty进行Android与Server端通信实现文字发送接收与图片上传

    ANOTHER TITLE: Let’s use netty to achieve text send and receive and  image transfer to server based ...

  6. oracle client 低于 oracle server 端,导致报错ORA-01882

    https://forums.toadworld.com/t/ora-01882-when-i-want-to-view-records-con-dba-scheduler-jobs-toad-10- ...

  7. 微服务学习三:springboot与springcloud集成之Eurake的使用(server端,client端)

    这个多亏了网站上的一个大神的博客: http://blog.csdn.net/forezp/article/details/70148833 强烈推荐学习: 1.springcloud是什么,这个大家 ...

  8. navicat连接oracle一个错误:ORA-12737 Instant Client Light:unsupported server character set ZHS16GBK

    今天使用Navicat连接Oracle数据库.它报告了以下错误:"ORA-12737 Instant Client Light:unsupported server character se ...

  9. HBase 协处理器编程详解第一部分:Server 端代码编写

    Hbase 协处理器 Coprocessor 简介 HBase 是一款基于 Hadoop 的 key-value 数据库,它提供了对 HDFS 上数据的高效随机读写服务,完美地填补了 Hadoop M ...

随机推荐

  1. convertquota - 把老的配额文件转换为新的格式

    总览 (SYNOPSIS) convertquota [ -ug ] filesystem 描述 (DESCRIPTION) convertquota 把老的配额文件 quota.user 和 quo ...

  2. WPF学习- 新建项目后自定义Main()[Type 'App' already defines a member called 'Main' with the same parameter types]

    问题点: 在App.xaml.cs中自己添加Main方法,编译会出现如下报错: 错误 CS0111 类型“App”已定义了一个名为“Main”的具有相同参数类型的成员  错误 Type 'App' a ...

  3. list.extend的结果是None

    执行list.exend()方法后,会直接修改list本身,而不会产生返回值 In [97]: d=(43,) In [98]: type(d) Out[98]: tuple In [99]: c O ...

  4. C# defult关键字

    一.问题 今天写一个函数提示用defult,因为第一次用记录一下 public static T GetConfig<T>(string strConfig) { try { return ...

  5. intellij idea集成github

    IDEA配置github并上传项目 http://www.cnblogs.com/jinjiyese153/p/6796668.html github ssl验证 https://www.cnblog ...

  6. oracle分析函数之ratio_to_report

    ratio_to_report主要完成对百分比的计算,语法为ratio_to_report(exp) over()也就是根据over窗口函数的作用区间,求出作用区间中的单个值在整个区间的总值的比重比如 ...

  7. swiper 旋转木马效果

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8&quo ...

  8. 题解 洛谷P4035/BZOJ1013【[JSOI2008]球形空间产生器】

    题目链接在这QvQ "你要求出这个n维球体的球心坐标",这使我想到的解方程...... 先假设n=2,这是一个二维平面.设圆心的坐标为\((x,y)\),有两个坐标\((a_1,b ...

  9. phpstorm破解激活码

    一.将“0.0.0.0 account.jetbrains.com”添加到hosts文件中 二.浏览器打开 http://idea.lanyus.com,点击页面中的“获得注册码”,然后在注册时切换至 ...

  10. 集训第五周动态规划 C题 编辑距离

    Description Let x and y be two strings over some finite alphabet A. We would like to transform x int ...