java实现Socket通信之单线程服务

前言

使用基于TCP 协议的双向通信时,网络中的两个应用程序之间必须首先建立一个连接,这两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。

建立网络通信连接至少要一对端口号(socket)。socket本质是编程接口(API),对TCP/IP的封装,TCP/IP也要提供可供程序员做网络开发所用的接口,这就是Socket编程接口;HTTP是轿车,提供了封装或者显示数据的具体形式;Socket是发动机,提供了网络通信的能力。

Socket的英文原义是“孔”或“插座”。作为BSD UNIX的进程通信机制,取后一种意思。通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,可以用来实现不同虚拟机或不同计算机之间的通信。在Internet上的主机一般运行了多个服务软件,同时提供几种服务。每种服务都打开一个Socket,并绑定到一个端口上,不同的端口对应于不同的服务。Socket正如其英文原意那样,像一个多孔插座。一台主机犹如布满各种插座的房间,每个插座有一个编号,有的插座提供220伏交流电, 有的提供110伏交流电,有的则提供有线电视节目。 客户软件将插头插到不同编号的插座,就可以得到不同的服务。

使用 socket 的通信模式

java.net 程序包将基于TCP 通信的socket 封装为两个类:类Socket 表达了一个用于建立TCP 连接的socket,该socket 既可由客户程序使用,也可由服务程序

使用;类ServerSocket 则是一个服务端专门监听客户程序连接请求的socket 的抽象,仅在服务程序中使用。

Socket通信过程

服务器端:

① 创建ServerSocket对象,绑定监听端口

② 通过accept()方法监听客户端请求

③ 连接建立后,通过输入流读取客户端发送的请求信息

④ 通过输出流向客户端发送响应信息

⑤ 关闭连接

客户端:
                 ① 创建Socket对象,指明需要连接的服务器的地址和端口号

② 连接建立后,通过输出流想服务器端发送请求信息

③ 通过输入流获取服务器响应的信息

④ 关闭连接

单线程服务程序代码

服务端:

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

public class EchoServer {
  public static void main(String[] args)throws IOException {
    if (args.length != 1) {
      System.out.println("用法:EchoServer <端口号>");
      return ;
    }

    // 监听客户程序的连接请求
    ServerSocket listenSocket = new ServerSocket(Integer.parseInt(args[0]));
    System.out.println("服务程序正在监听端口" + args[0]);
    Socket socket = listenSocket.accept();
    // 从与客户程序的新建连接获取输入流和输出流
    PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
    BufferedReader in = new BufferedReader(new InputStreamReader
      (socket.getInputStream()));
    // 从客户端读取数据,并写回数据的加工结果
    String message;
    while ((message = in.readLine()) != null) {
      System.out.println("收到请求:" + message);
      out.println(message.toUpperCase());
    }

    // 关闭连接
    out.close();
    in.close();
    socket.close();
    listenSocket.close();
  }
}

客户端:

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

public class EchoClient {
  public static void main(String[] args)throws Exception {
    if (args.length != 2) {
      System.out.println("用法:EchoClient <主机名> <端口号>");
      return ;
    }

    // 建立连接并打开相关联的输入流和输出流
    Socket socket = new Socket(args[0], Integer.parseInt(args[1]));
    System.out.println("当前socket信息:" + socket);
    PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
    BufferedReader in = new BufferedReader(new InputStreamReader
      (socket.getInputStream()));

    // 将控制台输入的字符串发送给服务端,并显示从服务端获取的处理结果
    BufferedReader stdIn = new BufferedReader(new InputStreamReader
      (System.in));
    String userInput;
    while ((userInput = stdIn.readLine()) != null) {
      out.println(userInput);
      System.out.println("返回:" + in.readLine());
    }
    stdIn.close();
    // 关闭连接
    out.close();
    in.close();
    socket.close();
  }
}

运行结果示例(基于windows)

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

(0)

相关推荐

  • python多线程socket编程之多客户端接入

    Python中实现socket通信的服务端比较复杂,而客户端非常简单,所以客户端基本上都是用sockct模块实现,而服务 端用有很多模块可以使用,如下: 1.客户端 #!/usr/bin/env python #coding:utf-8 ''' file:client.py date:9/9/17 3:43 PM author:lockey email:lockey@123.com desc:socket编程客户端,python3.6.2 ''' import socket,sys HOST =

  • 新手socket编程入门详解指南

    开发环境 运行平台:Ubantu 14.04 LTS 疑问引导 问题1:头文件的疑问: #include <sys/socket.h>与#include <linux/socket.h>有何区别? 解答: 1. 使用diff查看:adc分别表示添加.删除.修改 2. 其实是路径的不同导致有不同的socke.h文件 3. <sys/socket.h> 是 Internet Protocol family,也就是tcpip协议的应用层接口 4. <linux/sock

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

    TCP 是可靠的连接.这个可靠的意思就是得有明确的连接对象才行,就像是打电话,拨打的号码必须得在服务中有人接,这个网络会话才算是建立了. UDP: 不可靠的连接.不可靠的意思就是不太确定这个会话最后是不是真的送达你要连接的对象那里去了,就像是寄快递,把快递地址填上了,但是说不好半路会出点啥幺蛾子,能不能安全送达不一定. IP地址: 就是计算机的身份证.身份证号前六位数字是地址码(可以知道是哪个省哪个城市哪个县城),接着八位数字是出生日期码,IP地址也是这样的,它是由网络地址(确定是哪个网络)和主

  • node实现socket链接与GPRS进行通信的方法

    业务背景 最近接到一个需求,在微信公众号界面设计一个独立界面,界面上有 A 电机进.A 电机退.B 电机进.B 电机退 4 个按钮,点击对应按钮,云平台发送不同的代码给电机本地的控制器,控制电机执行不同的动作,电机本地控制器具备GPRS网络功能.服务器与电机本地控制器(客户端)采用 TCP 协议连接,客户端发送心跳包给服务器保持长连接,客户端每次收到服务器下发的代码指令后作出回复主要的实现原理是前端访问后台的接口传输数据.后台采用用socket与GPRS模块进链接,暴露出一个IP+PORT给GP

  • Java多线程编程实现socket通信示例代码

    流传于网络上有关Java多线程通信的编程实例有很多,这一篇还算比较不错,代码可用.下面看看具体内容. TCP是Tranfer Control Protocol的 简称,是一种面向连接的保证可靠传输的协议.通过TCP协议传输,得到的是一个顺序的无差错的数据流.发送方和接收方的成对的两个socket之间必须建 立连接,以便在TCP协议的基础上进行通信,当一个socket(通常都是server socket)等待建立连接时,另一个socket可以要求进行连接,一旦这两个socket连接起来,它们就可以

  • Java编程利用socket多线程访问服务器文件代码示例

    这篇文章将向大家展示Java编程利用socket多线程访问服务器文件代码示例,如果您想先了解Java多线程socket编程的基础知识,可以看下这篇文章:Java多线程编程实现socket通信示例代码. 接下来进入正文,我们看看利用socket多线程访问服务器代码: ServerMain.java package com.ysk.webServer; import java.io.File; import java.io.IOException; import java.net.ServerSoc

  • 如何基于C语言socket编程实现TCP通信

    TCP/IP协议(Transmission Control Protocol/Internet Protocol)叫做传输控制/网际协议,又叫网络通信协议.实际上,它包含上百个功能的协议,如ICMP(互联网控制信息协议).FTP(文件传输协议).UDP(用户数据包协议).ARP(地址解析协议)等.TCP负责发现传输的问题,一旦有问题就会发出重传信号,直到所有数据安全正确的传输到目的地. 套接字(socket):在网络中用来描述计算机中不同程序与其他计算机程序的通信方式.socket其实是一种特殊

  • 从零开始的Socket编程学习

    "一切皆socket!" 话虽些许夸张,但是事实也是,现在的网络编程几乎都是用的socket. 本地的进程间通信(IPC)有很多种方式,但可以总结为下面4类: 1.网络中进程之间如何通信? 2.Socket是什么? 3.socket的基本操作 3.1.socket()函数 3.2.bind()函数 3.3.listen().connect()函数 3.4.accept()函数 3.5.read().write()函数等 3.6.close()函数 4.socket中TCP的三次握手建立

  • java实现Socket通信之单线程服务

    前言 使用基于TCP 协议的双向通信时,网络中的两个应用程序之间必须首先建立一个连接,这两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket. 建立网络通信连接至少要一对端口号(socket).socket本质是编程接口(API),对TCP/IP的封装,TCP/IP也要提供可供程序员做网络开发所用的接口,这就是Socket编程接口:HTTP是轿车,提供了封装或者显示数据的具体形式;Socket是发动机,提供了网络通信的能力. Socket的英文原义是"孔"或

  • Python与Java间Socket通信实例代码

    Python与Java间Socket通信 之前做过一款Java的通讯工具,有发消息发文件等基本功能.可大家也都知道Java写的界面无论是AWT或Swing,那简直不是人看的,对于我们这些开发人员还好,如果是Release出去给用户看,那必须被鄙视到底.用C++的话,写的代码也是非常多的(QT这方面做得很好!),但我这里改用Python,以便到时用wxPython做界面.而且这两者跨平台也做得非常好. 这里只给出核心实现以及思路 Server(Java)接收从Clinet(Python)发送来的文

  • java利用socket通信实现Modbus-RTU通信协议的示例代码

    Modbus Modbus是一种串行通信协议.Modbus 一个工业上常用的通讯协议.一种通讯约定.Modbus协议包括RTU.ASCII.TCP.其中MODBUS-RTU最常用,比较简单,在单片机上很容易实现. 简单分析Modbus-RTU报文 37 03 10 3F 80 00 00 00 00 00 00 3F 80 00 00 40 40 00 00 24 dd(十六进制) 37:从站地址 ,03:功能码,10:读取的字节数,24 dd:crc校验码.其它就是传送的数据. 4G DTU(

  • Java使用Socket通信传输文件的方法示例

    本文实例讲述了Java使用Socket通信传输文件的方法.分享给大家供大家参考,具体如下: 前面几篇文章介绍了使用Java的Socket编程和NIO包在Socket中的应用,这篇文章说说怎样利用Socket编程来实现简单的文件传输. 这里由于前面一片文章介绍了NIO在Socket中的应用,所以这里在读写文件的时候也继续使用NIO包,所以代码看起来会比直接使用流的方式稍微复杂一点点. 下面的示例演示了客户端向服务器端发送一个文件,服务器作为响应给客户端回发一个文件.这里准备两个文件E:/test/

  • Java通过socket客户端保持连接服务端实现代码

    这篇文章主要介绍了Java通过socket客户端保持连接服务端实现代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 业务场景:现在有一个socket服务端给我们发送数据,我们需要建立一个socket Client来连接这个socket Server,然后接受server发送过来的数据.但是这个server可能会中断,所以在Client要有一个while死循环去时刻保持与Server的连接. package com.thinkgem.wlw.m

  • php与java通过socket通信的实现代码

    demo实现的简单功能是,接受PHP端写入的字符串,然后原样返回给输出端.代码如下: 复制代码 代码如下: import java.io.*; import java.net.*; public class Server { public static void main(String[] args) throws IOException{   System.out.println("Server started !\n");   ServerSocket server=new Ser

  • Java Socket通信(一)之客户端程序 发送和接收数据

    网络应用分为客户端和服务端两部分,而Socket类是负责处理客户端通信的Java类.通过这个类可以连接到指定IP或域名的服务器上,并且可以和服务器互相发送和接受数据. 对于Socket通信简述,服务端往Socket的输出流里面写东西,客户端就可以通过Socket的输入流读取对应的内容.Socket与Socket之间是双向连通的,所以客户端也可以往对应的Socket输出流里面写东西,然后服务端对应的Socket的输入流就可以读出对应的内容. 例1:客户端的简略写法(一). Socket clien

  • 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通信的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. Java中基于TCP协议实现网络通信的两个类:客户端的Socket和服务器端的ServerSocket. Socket通信模型如图所示: 不管Socket通信的功能有多复杂,任何socket通信过程的基本结构都是一样的. 其基本步骤为: ①分别在客户端和服务器端创建Socket和ServerSocket实例:服务器端通过.accept()方法等待请求并阻塞.请求收

  • Java基于socket实现的客户端和服务端通信功能完整实例

    本文实例讲述了Java基于socket实现的客户端和服务端通信功能.分享给大家供大家参考,具体如下: 以下代码参考马士兵的聊天项目,先运行ChatServer.java实现端口监听,然后再运行ChatClient.java 客户端实例 ChatClient.java package socketDemo; import java.awt.*; import java.awt.event.*; import java.io.*; import java.net.*; public class Ch

随机推荐