多个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. anchor_target_layer层其他部分解读

    inds_inside = np.where( (all_anchors[:, 0] >= -self._allowed_border) & (all_anchors[:, 1] > ...

  2. 一篇文章告你python能做什么,该不该学?好不好学?适不适合学?

    一.python好学吗?简单吗?容易学吗?没有编程的领取能学吗? 最近有很多小伙伴都在问我这些问题.在这里,我想说,python非常简单易学. 1,简单, Python 非常易于读写,开发者可以把更多 ...

  3. windows/linux 更新python pip

    linux环境下 pip install -U pip windows环境下 python -m pip install -U pip python -m pip install --upgrade ...

  4. [实现] 利用 Seq2Seq 预测句子后续字词 (Pytorch)

    最近有个任务:利用 RNN 进行句子补全,即给定一个不完整的句子,预测其后续的字词.本文使用了 Seq2Seq 模型,输入为5个中文字词,输出为一个中文字词. 目录 关于RNN 语料预处理 搭建数据集 ...

  5. 【PS切图】前端工程师必备,但又无需精通的一项技能。

    前端主要从事一些代码开发工作,PS使用是前端工程师必备,但又无需精通的一项技能. 前端切图四大面板:在“窗口”菜单下开启 1,信息(手动开启)2,字符(手动开启)3,历史记录(手动开启)4,图层(默认 ...

  6. 笔试算法题(31):将有序数组转换成BST表示 & 线段树的应用

    出题:要求将一个有序整数数组转换成最小深度的Binary Search Tree表示: 分析:由于需要是最小深度,所以BST应保持平衡,左右节点数大致相当,并且BST中当前根节点大于所有其左子树中的元 ...

  7. nodejs学习(一) ---- nodejs + express应用生成器 快速创建应用

    1.node安装及环境配置(自行百度) 2.express安装及配置 (自行百度) 3.通过应用生成器工具 express 快速创建应用骨架   全局安装应用生成器 : npm install exp ...

  8. 自媒体人Chrome浏览器必备插件精选神器!

    自从互联网时代起,浏览器使用从最早的IE,到opera,到猎豹浏览器,到360双核浏览器,到火狐,到safari,到目前最喜欢用的chrome.一路下来,chrome的稳定性与扩展性征服了我,成了我必 ...

  9. html css笔记 -度一

    """浏览器 shell 内核外表 内心 IE tridentFirefox Geckogoogle chrome webkit/blinksafari webkitop ...

  10. Codeforces Round #372 (Div. 2) A .Crazy Computer/B. Complete the Word

    Codeforces Round #372 (Div. 2) 不知不觉自己怎么变的这么水了,几百年前做A.B的水平,现在依旧停留在A.B水平.甚至B题还不会做.难道是带着一种功利性的态度患得患失?总共 ...