Java 实现简单Socket 通信的示例

目录
  • 1. 传输层协议
  • 2. TCP 示例
    • 2.1 示例效果
    • 2.2 服务端程序代码
  • 3. UDP 示例
    • 3.1 服务端程序代码
    • 3.2 客户端程序代码

Java socket 封装了传输层的实现细节,开发人员可以基于 socket 实现应用层。本文介绍了 Java socket 简单用法。

1. 传输层协议

传输层包含了两种协议,分别是 TCP (Transmission Control Protocol,传输控制协议) 和 UDP (User Datagram Protocol,用户数据报协议)。

TCP 是一种面向连接,可靠的流协议。通信双方在“发送-接收”数据之前需要先建立 TCP 连接,然后通过互相发送二进制数据流来进行通信。所谓连接,指的是各种设备、线路,或网络中进行通信的应用程序为了相互传递消息而建立的专有、虚拟的通信线路。连接一旦建立,进行通信的应用程序只使用该虚拟的通信线路发送和接收数据。TCP 还需要处理端到端之间的流量控制。

UDP 是一种无连接的,不可靠的数据报协议。发送方不需要与接收方建立连接,通信双方通过发送一个个独立的数据报来进行通讯。

TCP 通过序列号、确认应答、数据校验等机制确保了传输的可靠性,适用于需要可靠数据传输的场景,应用层协议 HTTP,FTP 基于 TCP。UDP 没有复杂的控制机制,不纠错,不重发,不保证数据的准确性,不确保数据到达目的地;不过 UDP 传送等量数据花费更小的流量,适用于对时延要求高但对准确性要求不高的场景,如视频、音频通讯。

Java 中有 3 种套接字类,java.net.Socket 和 java.net.ServerSocket 基于 TCP,java.net.DatagramSocket 基于 UDP。

2. TCP 示例

TCP 是面向连接的,所以在进行通讯之前发送端(客户端)需要先连接到接收端(服务端)。客户端通过 new Socket("localhost", 9090) 来创建一个连接到服务端的套接字,这个套接字连接到主机 localhost 的 9090 端口。

ServerSocket 实现服务端套接字,通过 new ServerSocket(9090) 来创建一个监听端口为 9090 实例;ServerSocket.accept() 方法会阻塞等待客户端的连接,一旦有连接过来,会返回一个服务端的 Socket 实例。连接建立完成,客户端 Socket 实例和服务端 Socket 实例就可以面向输入输出流发送数据了。

2.1 示例效果

客户端程序接收控制台输入的内容,客户端控制台每输入一行,就往服务端发送,服务端接收到消息之后,将消息打印到控制台。

客户端输入 "Bye" 时,客户端断开与服务端的连接,客户端程序退出,服务端程序继续等待连接。

客户端控制台输入输出:

$ java Server.java
Bind Port 9090
New client connected.
Received Message --> Are you OK!

服务端控制台输出:

$ java Client.java
Are you OK!
Send Msg --> Are you OK!
Bye
$

2.2 服务端程序代码

import java.net.*;
import java.io.*;

class Server {

 public static void main(String[] args) {
  // ServerSocket 实现了 AutoCloseable 接口,所以支持 try-with-resource 语句
  // 创建一个 ServerSocket,监听 9090 端口
  try(ServerSocket serv = new ServerSocket(9090)){
   System.out.printf("Bind Port %d\n", serv.getLocalPort());
   Socket socket = null;
   while(true){
    // 接收连接,如果没有连接,accept() 方法会阻塞
    socket = serv.accept();

    // 获取输入流,并使用 BufferedInputStream 和 InputStreamReader 装饰,方便以字符流的形式处理,方便一行行读取内容
    try(BufferedReader in = new BufferedReader( new InputStreamReader(socket.getInputStream()) )){
     String msg = null;
     char[] cbuf = new char[1024];
     int len = 0;
     while( (len = in.read(cbuf, 0, 1024)) != -1 ){ // 循环读取输入流中的内容
      msg = new String(cbuf, 0, len);
      if("Bye".equals(msg)) { // 如果检测到 "Bye" ,则跳出循环,不再读取输入流中内容。
       break;
      }
      System.out.printf("Received Message --> %s \n", msg);
     }
    }catch (IOException e){
     e.printStackTrace();
    }

   }

  }catch (IOException e){
   e.printStackTrace();
  }
 }
}
2.3 客户端程序代码
import java.net.*;
import java.io.*;
import java.util.*;

class Client{

 public static void main(String[] args){

  try(Socket socket = new Socket("localhost", 9090)){
   BufferedWriter out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
   Scanner scanner = new Scanner(System.in);
   scanner.useDelimiter("\r\n");
   String msg = null;
   while( !(msg = scanner.next()).equals("Bye") ){
    System.out.printf("Send Msg --> %s \n", msg);
    out.write(msg);
    out.flush(); // 立即发送,否则需要积累到一定大小才一次性发送
   }
  }catch (IOException e){
   e.printStackTrace();
  }

 }

}

3. UDP 示例

UDP 不需要连接,客户端与服务端通过发送数据报来完成通信。Java 中使用 java.net.DatagramSocket 来表示 UDP 客户端或服务端的套接字,使用 java.net.DatagramPacket 来表示 UDP 的数据报。客户端和服务端可以直接向对方发送数据报,不需要进行连接。

下面代码基于 UDP 实现了与上面程序同样的功能。不过消息可能会出错,某些消息可能也不能到达服务端。

3.1 服务端程序代码

import java.net.*;
import java.io.*;

class Server {

 public static void main(String[] args){

  // 创建一个 DatagramPacket 实例,用来接收客户端发送过来的 UDP 数据报,这个实例可以重复利用。
  byte[] buf = new byte[8192]; // 缓存区
  int len = buf.length;  // 要利用的缓存区的大小
  DatagramPacket pac = new DatagramPacket(buf, len);

  // 创建服务端的套接字,需要指定绑定的端口号
  try(DatagramSocket serv = new DatagramSocket(9191)){

   while(true){
    serv.receive(pac); // 接收数据报。如果没有数据报发送过来,会阻塞
    System.out.println("Message --> " + new String(pac.getData(), 0, pac.getLength()));
   }

  }catch (IOException e){
   e.printStackTrace();
  }
 }

}

3.2 客户端程序代码

import java.io.*;
import java.net.*;
import java.util.*;

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

  // 创建一个客户端的 UDP 套接字,不需要指定任何信息
  try(DatagramSocket client = new DatagramSocket()){

   // 创建一个数据报实例,数据和长度在发送之前都会重新设置,所以这里直接置为 0 即可。
   // 由于是发送端,所以需要设置服务端的地址和端口
   DatagramPacket pac = new DatagramPacket(new byte[0], 0, InetAddress.getByName("localhost"), 9191);

   // 扫描控制台输入
   Scanner scanner = new Scanner(System.in);
   scanner.useDelimiter("\r\n");
   String msg = null;
   while( !(msg = scanner.next()).equals("Bye") ){
    // 设置要发送的数据
    pac.setData(msg.getBytes());
    // 发送数据报
    client.send(pac);
    System.out.println("Sent Message --> " + msg);
   }
  }catch (IOException e){
   e.printStackTrace();
  }

 }
}

需要注意的是,UDP 是面向无连接的,但 DatagramSocket 的 API 中提供了带有 connect 字样的方法,这里的 connect 并非 TCP 中连接的意思。而是指定了当前的 UDP 套接字只能够向指定的主机和端口发送数据报。

以上就是Java 实现简单Socket 通信的示例的详细内容,更多关于Java 实现Socket 通信的资料请关注我们其它相关文章!

(0)

相关推荐

  • Java使用Socket简单通讯详解

    目录 Java实现基于Socket的简单通信  一.ServerSocket 1.使用JavaFX写的小界面,方便观察客户端连接情况 2.创建ServerSocket并处理客户端连接并显示客户端基本信息 3.新建Handle类处理接收发送两个客户端的消息 二.Socket 1.同样的编写一个客户端界面 2.创建Socket连接客户端并获取输入输出流 3.添加编辑框监听处理消息发送 4.创建新线程从服务器上接收消息 三.测试 四.总结 1.原理流程 2.不足之处 Java实现基于Socket的简单

  • Java基于TCP协议socket网络编程的文件传送的实现

    先了解一下socket基本概念 socket也叫套接字: 是指在网路中不同主机上的应用进程之间,进行双向通信的端点的抽象. 简单理解就是: 两个主机之间要通信,就需要知道彼此的ip,端口号等信息,而一台主机这些信息的集合: 就可以理解为一个端点,即为套接字 双方通过套接字作为一种坐标,建立信息通道,形成连接(两点连接一条直线) 简单理解了套接字的概念后,来看看如何通过java socket编程来实现 两台主机文件的接收与发送: 代码如下: 发送方: import java.io.*; impor

  • Java中Socket用法详解

    目录 1 问题引入 1.1 网络架构模型 1.1.1 OSI参考模型 1.1.2 TCP/IP五层模型 1.1.3 各协议层的说明 1.2 网络编程中的问题 1.3 TCP协议与UDP协议 1.3.1 TCP 1.3.2 UDP 1.3.3 TCP和UDP的区别 2 socket网络编程 2.1什么是socket? 2.2 Socket的原理 3 基于java的socket网络编程实现 3.2 基于UDP的socket实现 1 问题引入 1.1 网络架构模型 网络架构模型主要有OSI参考模型和T

  • Java基于TCP协议的Socket通信

    目录 简介 TCP简介 JAVA Socket简介 SocketImpl介绍 TCP 编程 构造ServerSocket 1.1 绑定端口 1.2 设定客户连接请求队列的长度 1.3 设定绑定的IP 地址 1.4 默认构造方法的作用 多线程示例 简介 TCP简介 TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的.可靠的.基于字节流的传输层通信协议,由IETF的RFC 793定义.在简化的计算机网络OSI模型中,它完成第四层传输层所指定的功能,用户

  • Java socket通讯实现过程及问题解决

    这篇文章主要介绍了Java socket通讯实现过程及问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 本来是打算验证java socket是不是单线程操作,也就是一次只能处理一个请求,处理完之后才能继续处理下一个请求.但是在其中又发现了许多问题,在编程的时候需要十分注意,今天就拿出来跟大家分享一下. 首先先建立一个服务端代码,运行时也要先启动此程序. package com.test.some.Socket; import java.i

  • Java 实现简单Socket 通信的示例

    目录 1. 传输层协议 2. TCP 示例 2.1 示例效果 2.2 服务端程序代码 3. UDP 示例 3.1 服务端程序代码 3.2 客户端程序代码 Java socket 封装了传输层的实现细节,开发人员可以基于 socket 实现应用层.本文介绍了 Java socket 简单用法. 1. 传输层协议 传输层包含了两种协议,分别是 TCP (Transmission Control Protocol,传输控制协议) 和 UDP (User Datagram Protocol,用户数据报协

  • 基于Java语言实现Socket通信的实例

    基于Java语言实现Socket通信 由于近日项目需求,需要在服务器中增加Socket通信的功能,接收硬件设备发送的心跳包和相关数据,因此又重新对Java的网络编程进行了复习,根据项目的实际情况做了简化的编程,实现了简单的通信过程. 1. Socket通信原理 源IP地址和目的IP地址以及源端口号和目的端口号的组合称为套接字.其用于标识客户端请求的服务器和服务. 以下是通过Socket套接字实现客户端与服务器端通信的示意图: 在实际应用中,客户端会通过访问服务器的IP和PORT连接到服务器端,这

  • python实现简单socket通信的方法

    本文实例讲述了python实现简单socket通信的方法.分享给大家供大家参考,具体如下: 刚刚开始接触python,实现了一个helloworld程序---关于udp协议的socket通信demo. 首先服务端这边的实现如下: import socket, traceback host = '' # Bind to all interfaces port = 51500 # Step1: 创建socket对象 s = socket.socket(socket.AF_INET, socket.S

  • java中处理socket通信过程中粘包的情况

    这两天学习了java中处理socket通信过程中粘包的情况,而且很重要,所以,今天添加一点小笔记. 处理粘包程序是客户端的接受消息线程: 客户端: import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.io.Reader; import java.net.Socket; impo

  • 使用Java实现简单串口通信

    本博文参考自https://www.jb51.net/article/100269.htm www.jb51.net/article/100269.htm 没想到挺多人需要这个的,很高兴这篇文章能对大家有帮助,主要的工具类博文里已经有了,当然,要小工具源码的留言邮箱即可. 2019.09.05 最近接触到了串口及其读写,在此记录java进行串口读写的过程. 1.导入支持java串口通信的jar包: 在maven项目的pom.xml中添加RXTXcomm的依赖 或者 下载RXTXcomm.jar并

  • Java实现简单的五子棋游戏示例代码

    目录 项目结构 核心代码 ArrComparator.java类 ChessMap.java类 ChessPanel.java类 效果图展示 项目结构 这个是在网上找的资源,出处记不得了,记录一下.程序的总体结构,很简单的: 核心代码 代码如下: ArrComparator.java类 import java.util.Comparator; /** * 排序 Comparator */ class ArrComparator implements Comparator<Object> { i

  • JAVA实现基于Tcp协议的简单Socket通信实例

    好久没写博客了,前段时间忙于做项目,耽误了些时间,今天开始继续写起~ 今天来讲下关于Socket通信的简单应用,关于什么是Socket以及一些网络编程的基础,这里就不提了,只记录最简单易懂实用的东西.  1.首先先来看下基于TCP协议Socket服务端和客户端的通信模型: Socket通信步骤:(简单分为4步) 1.建立服务端ServerSocket和客户端Socket 2.打开连接到Socket的输出输入流 3.按照协议进行读写操作 4.关闭相对应的资源 2.相关联的API: 1.首先先来看下

  • Java实现的串口通信功能示例

    本文实例讲述了Java实现的串口通信功能.分享给大家供大家参考,具体如下: 用Java实现串口通信(windows系统下),需要用到sun提供的串口包 javacomm20-win32.zip.其中要用到三个文件,配置如下: 1.comm.jar放置到 JAVA_HOME/jre/lib/ext; 2.win32com.dll放置到 JAVA_HOME/bin; 3.javax.comm.properties 两个地方都要放     jre/lib(也就是在JAVA文件夹下的jre)    JA

  • Python基本socket通信控制操作示例

    本文实例讲述了Python基本socket通信控制操作.分享给大家供大家参考,具体如下: python - 基本socket通信控制(控制在celie.txt文件中主机IP地址可以发送信息,并返回对应的客户端IP.时间戳.发送的信息) 客户端代码 root@72129clent:~/python/snmp# ls snmpclenit.py tab.py root@72129clent:~/python/snmp# cat snmpclenit.py #!/usr/bin/python # --

  • C语言编写基于TCP和UDP协议的Socket通信程序示例

    Tcp多线程服务器和客户端程序 服务器程序: #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <sys/types.h> #include <sys/socket.h> #include <unistd.h> #define PORT 8082 #define BUFSIZE 512 cha

随机推荐