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

socket()函数死锁

发布网友 发布时间:2022-04-22 08:45

我来回答

1个回答

热心网友 时间:2022-05-13 03:58

这是我在网上找的对socket比较详细说明的文章了!希望你能看明白!事实上网络编程简单的理解就是两台计算机相互通讯数据而已,对于程序员而言,去
掌握一种编程接口并使用一种编程模型相对就会显得简单的多了,Java SDK提供一些
相对简单的Api来完成这些工作。Socket就是其中之一,对于Java而言,这些Api存在
与java.net 这个包里面,因此只要导入这个包就可以准备网络编程了。

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

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

=new Socket(InetAddress.getLocalHost(),5678);客户机必须知道有关服务器的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 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();
 }
}

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

  客户机代码:

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就建立起来了。

热心网友 时间:2022-05-13 03:58

这是我在网上找的对socket比较详细说明的文章了!希望你能看明白!事实上网络编程简单的理解就是两台计算机相互通讯数据而已,对于程序员而言,去
掌握一种编程接口并使用一种编程模型相对就会显得简单的多了,Java SDK提供一些
相对简单的Api来完成这些工作。Socket就是其中之一,对于Java而言,这些Api存在
与java.net 这个包里面,因此只要导入这个包就可以准备网络编程了。

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

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

=new Socket(InetAddress.getLocalHost(),5678);客户机必须知道有关服务器的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 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();
 }
}

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

  客户机代码:

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就建立起来了。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
蚂蚁泡酒适合哪些人喝 蚂蚁酒的功效与禁忌蚂蚁酒的功效与作用 热血无赖卡怎么办 了解这两方面内容 益生菌孕妇 孕妇能喝益生菌吗 羽毛球双打底线是内线还是外线 为什么泰国两位尊者有不死之身 秦始皇活了多少岁?当了几年皇帝? DELL电脑D630.PP18L2手机。才用了4个多月。多少钱我可以买呢,麻烦谁说... dellpp18l现在买多少钱 Pet疗法的治疗理论是怎样的? socket类的哪个方法返回 scoket对象绑定的本地端口 PET与PVC怎么样分别 班上好和坏感想的作文 Winsock 编程WSAsocket错误,为什么返回10047错误... PET材料“破壁”进入家居界,前景如何? 以前的坏感觉 请教WSASocket函数 需要什么头文件 PET有什么优点 最近的表现给人浮躁,不专心,的坏感觉怎么办 getpeername可以用于提取WSASocket函数创建的句柄... 为什么我喜欢那种坏坏感觉又很好笑的女生?? WSASocket()的返回值 PET的难度怎么样啊?分为哪几个等级啊? 坏感觉!!哥哥姐姐帮帮.. WSASocket()的定义 周传雄的坏感觉的歌词?谁可以告诉我? pet是什么材质,它的用途是什么,怎样的规格 周传雄的坏感觉的歌词 谁能告诉我? pet和pvc怎样区分? 无主之地2怎么拿到50级坏触感,我给莫西小姐姐的钱... 车载充电器双充2.1a和1a有什么区别 请教如何重定向cmd.exe的输入输出到一个socket PET考试在英国认可度怎么样? C++ socket编程 和 MFC socket编程 有什么区别?? 网络通信数据TCP传输时好时坏,寻求高人 车载充电器“1a”和“2.1a”是什么意思? apache如何禁止某地区访问? WSARecv()的错误代码 怎样用C语言实现网络抓包? 充电宝的输出1a和2.1a是什么意思 c++怎么检查网络连接状态? 手机充电的数据线有没有区分1A 2A的? 20G钢管与12Cr13焊接用什么电焊条 安装Moodle时,PHP 打开apache 出现apache started... 你好,手机充电器显示1A.2.1A是什么意思? C++中ws2 32.lib的用法与作用 移动电源上1A,2.1A的有什么区别 启动xampp时刚一Apache 一start就自动stop怎么办 车载充电器上1.0a 2.1a 3.1a分别什么意思