问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

java编程中,Socket通信是怎么实现的?

发布网友 发布时间:2022-04-20 07:06

我来回答

1个回答

热心网友 时间:2023-06-28 17:06

  网络编程的基本模型就是客户机到服务器模型 简单的说就是两个进程之间相互通讯 然后其中一个必须提供一个固定的位置 而另一个则只需要知道这个固定的位置 并去建立两者之间的联系 然后完成数据的通讯就可以了 这里提供固定位置的通常称为服务器 而建立联系的通常叫做客户端 基于这个简单的模型 就可以进入网络编程啦

  Java对这个模型的支持有很多种Api 而这里我只想介绍有关Socket的编程接口 对于Java而言已经简化了Socket的编程接口 首先我们来讨论有关提供固定位置的服务方是如何建立的 Java提供了ServerSocket来对其进行支持 事实上当你创建该类的一个实力对象并提供一个端口资源你就建立了一个固定位置可以让其他计算机来访问你 ServerSocket server=new ServerSocket( );这里稍微要注意的是端口的分配必须是唯一的 因为端口是为了唯一标识每台计算机唯一服务的 另外端口号是从 ~ 之间的 前 个端口已经被Tcp/Ip 作为保留端口 因此你所分配的端口只能是 个之后的 好了 我们有了固定位置 现在所需要的就是一根连接线了 该连接线由客户方首先提出要求 因此Java同样提供了一个Socket对象来对其进行支持 只要客户方创建一个Socket的实例对象进行支持就可以了 Socket client

  =new Socket(InetAddress getLocalHost() );客户机必须知道有关服务器的IP地址 对于著一点Java也提供了一个相关的类InetAddress 该对象的实例必须通过它的静态方法来提供 它的静态方法主要提供了得到本机IP 和通过名字或IP直接得到InetAddress的方法

  上面的方法基本可以建立一条连线让两台计算机相互交流了 可是数据是如何传输的呢?事实上I/O操作总是和网络编程息息相关的 因为底层的网络是继续数据的 除非远程调用 处理问题的核心在执行上 否则数据的交互还是依赖于IO操作的 所以你也必须导入java io这个包 java的IO操作也不复杂 它提供了针对于字节流和Unicode的读者和写者 然后也提供了一个缓冲用于数据的读写

  BufferedReader in=new BufferedReader(new InputStreamReader(server getInputStream()));

  PrintWriter out=new PrintWriter(server getOutputStream());

  上面两句就是建立缓冲并把原始的字节流转变为Unicode可以操作 而原始的字节流来源于Socket的两个方法 getInputStream()和getOutputStream()方 分别用来得到输入和输出 那么现在有了基本的模型和基本的操作工具 我们可以做一个简单的Socket例程了

  服务方:

  import java io *;

  import *;

  public class MyServer {

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

  ServerSocket server=new ServerSocket( );

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

  }

  }

  这个程序的主要目的在于服务器不断接收客户机所写入的信息只到 客户机发送 End 字符串就退出程序 并且服务器也会做出 Receive 为回应 告知客户机已接收到消息

  客户机代码:

  import *;

  import java io *;

  public class Client{

  static Socket server;

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

  server=new Socket(InetAddress getLocalHost() );

  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 *;

  public class MyServer {

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

  ServerSocket server=new ServerSocket( );

  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 *;

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

  while(true){

  //transfer location change Single User or Multi User

  MultiUser mu=new MultiUser(server accept());

  mu start();

  }

  }

  }

lishixin/Article/program/Java/hx/201311/27013
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
现在办理的优待证以后还可以领钱吗? 读台湾的大学 台湾专科学院排名是什么?致理学院是专科第一吗? 台湾 致理技术学院 致理技术学院详细资料大全 徽信是什么意思? 聚美优品视频是用啥软件做的啊 ? 聚美优品怎么使用 聚美优品使用教程汇总 什么体重秤称比较准 给我一篇什么真让我着迷的作文 (600个字以上) java建立socket连接 java简答题 如何创建socket连接的过程 java中如何创建socket连接的过程 java Socket通信原理 祝福 诗词 对新一年美好祝愿诗句 古诗词里最美好的祝愿 求新年祝福词语 给同事发什么春节祝福,要轻松一些的(60字以内)? 幼儿园开学祝福语古诗 关于“错”的诗句 代表美好的诗词 含有错的诗句有哪些? 表达美好祝愿的诗句有哪些 关于新年的宋词 元旦快乐的诗句 关于迎新年的诗句古诗 探春令表达了作者怎样的感情 新春的古诗 《探春令》这首词主要表达了什么感情? Java Socket连接问题 java中如何创建socket连接的过程? java中Socket通信 JAVA socket通信 Java Socket 长连接怎么实现 java关于socket多连接 java中怎么判断socket是否连接成功 java中的socket是什么意思? java的socket通信 Java Socket 连接不上服务器 java socket如何实现客户端与客户端的交互? java socket连接问题 如何让socket连接跨过路由器 java中用socket实现客户端与服务端双向连接问题 java关于Socket连接错误问题 java中使用Socket连接,关闭是出异常如何处理? 减肥酵制作方法,谁会呢?求方法~~~~~~ 华为nove4进水后出现频闪之后黑屏,但是应用提示音... 华为Nova4淋雨之后手机屏幕不定时的闪一下,前置摄... 华为nova4屏幕换一个多少钱? 怎么自己做减肥酵素