如何实现socket网络编程的多线程

 更新时间:2019年05月20日 17:10:47   作者:南下Debugging  
首先,学好计算机网络知识真的很重要。虽然,学不好不会影响理解下面这个关于宏观讲解,但是,学好了可以自己打渔吃,学不好就只能知道眼前有鱼吃却打不到渔。在Java中网络程序有2种协议:TCP和UDP,下面可以和小编一起学习下

本文主要介绍了如何实现socket网络编程的多线程,分享给大家

TCP 、UDP、IP地址的基本介绍:

  • TCP

是可靠的连接。这个可靠的意思就是得有明确的连接对象才行,就像是打电话,拨打的号码必须得在服务中有人接,这个网络会话才算是建立了。

  • UDP:

不可靠的连接。不可靠的意思就是不太确定这个会话最后是不是真的送达你要连接的对象那里去了,就像是寄快递,把快递地址填上了,但是说不好半路会出点啥幺蛾子,能不能安全送达不一定。

  • IP地址:

就是计算机的身份证。身份证号前六位数字是地址码(可以知道是哪个省哪个城市哪个县城),接着八位数字是出生日期码,IP地址也是这样的,它是由网络地址(确定是哪个网络)和主机地址(网络中的哪个主机)组成的。

本机地址: localhost等价于 127.0.0.1

下面的例子是基于TCP协议进行的。

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

  //打开一个套接字,准备发送请求
  Socket socket = new Socket("localhost", 9996);//得先建立连接,就是所谓的TCP是建立可靠的连接

  System.out.println("尊敬的VIP客户,请求数据小分队已准备好,请输入您的请求:");

  //向服务端发送带着客户端请求的数据,这个请求数据是从键盘读入的,发送给服务端是以PrintWriter的形式包装
  PrintWriter out =new PrintWriter(socket.getOutputStream(),true);

  //输入流getInputStream(),单独开一个线程在Receive类中完成接收服务器发来的数据
  Thread t = new Thread(new Receive(socket));
  t.start();

  Scanner scanner =new Scanner(System.in);//键盘输入
  while(scanner.hasNextLine()){
   out.println(scanner.nextLine());//将从键盘输入的数据发送出去
  }

 }
}

public class Receive implements Runnable {
 private Socket socket;
 public Receive(Socket socket) {
  this.socket=socket;
 }

 @Override
 public void run() {
  try {
   Scanner scanner =new Scanner(socket.getInputStream());//接收数据
   String str =null;
   while(true){
    str=scanner.nextLine();
    System.out.println("服务器说:"+str);//打印接收的数据
   }
  } catch (IOException e) {
   e.printStackTrace();
  }

 }

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

  ServerSocket server = new ServerSocket(9996);//在端口9996开一个服务,监听客户端发来的请求,准备接收客户端发来的请求数据

  System.out.println("服务端准备完毕,随时待命接收请求!");

  Socket socket =server.accept();//只有当有客户端请求并连接时,才回返回一个Socket对象,这个对象就是带着客户端请求的那个Socket对象


  //创建一个PrintWriter的实例对象out来完成服务端向客户端的输出数据的任务,
  PrintWriter out = new PrintWriter(socket.getOutputStream(),true);

  //单独开一个线程接收从客户端过来的请求,在Receive1类中完成数据的接收
  Thread t = new Thread(new Receive1(socket));
  t.start();

  /*一定要理解Socket是一个用于机器之间通信的类*/

  //发送数据给客户端
  Scanner scanner = new Scanner(System.in);//键盘输入服务端要发给客户端的数据
  while(scanner.hasNextLine()){
   out.println(scanner.nextLine());//将键盘输入的服务端要发给客户端的数据封装在PrintWriter类的对象中
  }
 }
}
public class Receive1 implements Runnable {
 private Socket socket;
 public Receive1(Socket socket) {
  this.socket=socket;//在服务端接收客户端发来的数据需要调用Receive1()这个方法,就会得到一个Socket对象,这个对象就是携带着客户端请求的socket
 }

 @Override
 public void run() {
  try {
   Scanner scanner=new Scanner(socket.getInputStream());//获得客户端从键盘接收的输入流
   String str = null;
   while(true){
    str=scanner.nextLine();
    System.out.println("客户端发来的数据:"+str);
   }
  } catch (IOException e) {
   e.printStackTrace();
  }//接收数据
 }

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家

相关文章

  • C语言开发实现贪吃蛇游戏

    C语言开发实现贪吃蛇游戏

    这篇文章主要为大家详细介绍了C语言开发实现贪吃蛇游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-07-07
  • 初学C++之自定义类型名简化详解

    初学C++之自定义类型名简化详解

    下面小编就为就大家带来一篇初学C++之自定义类型名简化详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-09-09
  • C++中strtok()函数的用法介绍

    C++中strtok()函数的用法介绍

    以下是对C++中strtok()函数的使用方法进行了详细的分析介绍,需要的朋友可以过来参考下
    2013-09-09
  • C++中的new/delete、构造/析构函数、dynamic_cast分析

    C++中的new/delete、构造/析构函数、dynamic_cast分析

    这篇文章主要介绍了C++中的new/delete、构造/析构函数、dynamic_cast分析 本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-05-05
  • C++实现LeetCode(228.总结区间)

    C++实现LeetCode(228.总结区间)

    这篇文章主要介绍了C++实现LeetCode(228.总结区间),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • C语言实现俄罗斯方块源代码

    C语言实现俄罗斯方块源代码

    这篇文章主要为大家详细介绍了C语言实现俄罗斯方块的源代码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-06-06
  • Visual Studio 2019安装、测试创建c语言项目(图文教程)

    Visual Studio 2019安装、测试创建c语言项目(图文教程)

    这篇文章主要介绍了Visual Studio 2019安装、测试创建c语言项目,Visual Studio 2019是完全免费的,而且安装比较简单,现在把安装步骤分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2020-03-03
  • c++ String去除头尾空格的方法

    c++ String去除头尾空格的方法

    这篇文章主要介绍了c++ String去除头尾空格的方法,非常具有实用价值,需要的朋友可以参考下
    2014-10-10
  • linux c 获得当前进程的进程名和执行路径(示例)

    linux c 获得当前进程的进程名和执行路径(示例)

    如何得到当前进程的进程名和执行路径。写了个程序分享一下
    2013-07-07
  • C++入门笔记之std::vector容器详解

    C++入门笔记之std::vector容器详解

    这篇文章主要给大家介绍了关于C++之std::vector容器的相关资料,vector,一种随机访问的数组类型,它提供了对数组元素的快速、随机访问,以及在序列尾部快速、随机的插入和删除操作,需要的朋友可以参考下
    2021-07-07

最新评论