关于Socket的解析以及双方即时通讯的java实现方法

在Java编程之中,我们通常都会接触到网络编程,那么不可避免地就会接触到Socket通信,下面我将对Socket进行简单的解析,并给出双方通讯的代码实现方案

首先我们来介绍一下整个Socket的通信过程

首先服务端先创建一个SocketServer,那么创建一个SocketServer需要我们指定端口号,如下

ServerSocket serverSocket=new ServerSocket(8888);

像上面这样我们就简单的开了一个端口号为8888的ServerSocket了

接下来我们需要去接收来自客户端的连接请求,也就是图中的Other Socket,我们可以利用SockerServer的accept方法来建立连接,并且这个方法会返回一个Socket,用于和Other Socker进行通信,简单来说,我们就是利用SockerServer来获取Socket,然后利用这个Socket和别人通信

接下来我们获取Socket的输入输出流,实现发送和接收信息,到此,我们已经知道两方进行Socket通信的基本思路了

接下来我们来看看关于ServerSocket以及Socket的一些关键方法

ServerSocket

首先我们看一下ServerSocket的构造方法,一共有4种:

1、无参的构造方法 :

ServerSocket(), 返回没有绑定端口号的ServerSocket实例
2、含一个参数的构造方法 :

ServerSocket(int port),返回绑定给定端口号的ServerSocket实例

3、含两个参数的构造方法 :

ServerSocket(int port, int backlog),返回绑定给定端口号的ServerSocket实例,并且设定同步队列(syns queue)的大小

4、含三个参数的构造方法:

ServerSocket(int port, int backlog, InetAddress bindAddr),返回绑定给定端口号的ServerSocket实例,并且设定同步队列(syns queue)的大小以及绑定给定的IP地址

主要看它的一些方法:

accept()

这个方法监听连接,一旦连接就返回一个Socket用于通信,需要注意的是,该方法为阻塞方法,如果没有连接程序并不会继续执行下去

close()

关闭Socket,如果accept还在阻塞的话,就会抛出一个SocketException的异常

关于ServerSocket就不多加赘述了,我们来看一看Socket

Socket

构造方法依然存在多种,这里只给出一个较为典型的

Socket(String host, int port),第一个参数是主机的IP地址作为字符串传入,第二个参数为端口号

getInputStream(), getOutputStream()

获得Socket的输入输出流,我们可以利用BufferReader以及PrintWriter来对这两个流进行操作,如下:

  BufferReader reader = new BufferedReader(
                  new InputStreamReader(socket.getInputStream()));
  PrintWriter writer = new PrintWriter(
                  new OutputStreamWriter(socket.getOutputStream()));

下面简单编写一个双方互相通信的java实现

首先是服务端

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
/**
* Created by Mezereon on 2017/3/1.
*/
public class TCPServer {
 private Socket socket;
 private ServerSocket serverSocket;
 private BufferedReader reader;
 private PrintWriter writer;
 private Scanner scanner = new Scanner(System.in);
 //开启服务
 public void run() throws IOException {
     startTheSocket();
 }
 public void startTheSocket() throws IOException {
   serverSocket=new ServerSocket(18080); //打开18080端口等待连接
   acceptTheSocket();//接受连接并且初始化Socket,reader,writer
   openTheNewThreadToGetMessageFromClient();
   while(true) {
      getYourMessage();//获取键盘数据并作为输入
   }
 }
 //接受连接并且初始化Socket,reader,writer
 private void acceptTheSocket() throws IOException {
   socket=serverSocket.accept();//阻塞方法,用于接受Socket连接
   System.out.println("Some one connect me ,it is "+socket.getLocalSocketAddress());//打印地址
   System.out.println("It's port is "+socket.getPort());//打印端口号
   reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));//获得输入流
   writer = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));//获得输出流
 }
 //扫描键盘并输入数据
 private void getYourMessage() throws IOException {
   String yourMessage = scanner.nextLine();
   checkYourMessage(yourMessage);//检查发送给客户端的信息
   writer.println(yourMessage);//发送信息
   writer.flush();//flush方法用于清空缓冲区,注意的是如果不flush你的信息可能发不出去一直存留在缓冲区
 }
 //用于检查是否退出
 private void checkYourMessage(String yourMessage) throws IOException {
   //关闭各种
   if (yourMessage.equals("exit")) {
     socket.close();
     writer.close();
     reader.close();
     System.exit(0);
   }
 }
 //开启一个新的线程来监听客户端发来的信息
 private void openTheNewThreadToGetMessageFromClient() throws IOException {
   //开启一个新的线程
   new Thread(new Runnable() {
     @Override
     public void run() {
       getTheMessageFromClient();
     }
   }).start();

 }
 //不断循环来获取客户端发来的信息
 private void getTheMessageFromClient() {
   while(true) {
     String messageFromClient = null;
     try {
       messageFromClient = reader.readLine();
     } catch (IOException e) {
       e.printStackTrace();
     }
     printTheMessage(messageFromClient);//打印客户端发来的信息
   }
 }
 //打印客户端发来的信息
 private void printTheMessage(String messageFromClient) {
   if(messageFromClient!=null)
     System.out.println("He say:"+messageFromClient);
 }
}

然后开始编写客户端:

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

/**
 * Created by Mezereon on 2017/2/27.
 */
public class TCPClient {

  private Socket socket;
  private BufferedReader reader ;
  private PrintWriter writer;
  private Scanner scanner = new Scanner(System.in);

  //开启Socket来连接
  public void run() throws IOException{
      startTheSocket();
  }

  //开始连接服务端
  private void startTheSocket() throws IOException{
      toConnectTheServer();//创建Socket并初始化
      openTheThreadToReceiveInfoFromServer();//开启一个新的线程来接受服务端发来的信息

      //一个循环,用于读取键盘的输入
      while(true) {
        String yourMessage = scanner.nextLine();
        //不为空则发送信息
        if(yourMessage!=null) {
          writer.println(yourMessage);
          writer.flush();//记得flush清空缓冲区
        }
        //判断是否退出
        if (yourMessage.equals("exit")) {
          disConnect();
          System.exit(0);
        }
      }
  }

  //创建一个Socket来连接本机的18080端口的服务端并初始化reader和writer
  private void toConnectTheServer() throws IOException {
    socket=new Socket("127.0.0.1",18080);
    reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    writer = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()),true);
  }

  private void openTheThreadToReceiveInfoFromServer() throws IOException {
    new Thread(new Runnable() {
      @Override
      public void run() {
        try {
          printMessage();//打印从服务端收到的信息
        } catch (IOException e) {
          e.printStackTrace();
        }
      }
    }).start();
  }

  //循环不断读取服务端的信息
  private void printMessage() throws IOException {
    while (true) {
      String messageFromServer = null;
      try {
        messageFromServer = reader.readLine();//读取信息
        System.out.println("He say:" + messageFromServer);//打印信息
      } catch (IOException e) {
        e.printStackTrace();
      } catch (NullPointerException e) {

      }
      if(messageFromServer.equals("exit")){
        disConnect();//关闭连接
        System.exit(0);
      }
    }
  }

  //关闭各种
  private void disConnect() throws IOException {
    socket.close();
    reader.close();
    writer.close();
  }

}

至此,关于Socket通信简单的介绍以及利用java进行简单的通信的实现就结束了~

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

(0)

相关推荐

  • Java Socket实现文件传输示例代码

    最近学Socket学上瘾了,就写了一个简单的文件传输程序. 客户端设计思路:客户端与服务端建立连接,选择客户端本地文件,先将文件名及大小等属性发送给服务端,再将文件通过流的方式传输给服务端.传输的进度打印到控制台中,直到传输完成. 服务端设计思路:服务端接收客户端的请求(阻塞式),每接收到一个客户端请求连接后,就新开一个处理文件的线程,开始写入流,将文件到服务器的指定目录下,并与传输过来的文件同名. 下面是客户端和服务端的代码实现: 客户端代码: import java.io.DataOutpu

  • Java通过 Socket 实现 TCP服务端

    1 Java Socket简介 所谓socket 通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄.应用程序通常通过"套接字"向网络发出请求或者应答网络请求.Socket和ServerSocket类库位于Java.NET包中.ServerSocket用于服务器端,Socket是建立网络连接时使用的.在连接成功时,应用程序两端都会产生一个Socket实例,操作这个实例,完成所需的会话.对于一个网络连接来说,套接字是平等的,并没有差别,不因为在服务器端或

  • java搭建一个Socket服务器响应多用户访问

    当我们搭建了一个Socket服务端,是需要去响应多用户的访问的.此时,我们就要使用多线程,为每个访问的用户建立一个线程来响应该用户的访问. 具体实现,看如下代码: package com.sun.socket; import Java.io.IOException; import java.NET.*; import java.io.*; import java.util.*; /** * Description: * 搭建一个Socket服务器响应多用户访问 * @author Lee * *

  • 基于Tomcat7、Java、WebSocket的服务器推送聊天室实例

    前言 HTML5 WebSocket实现了服务器与浏览器的双向通讯,双向通讯使服务器消息推送开发更加简单,最常见的就是即时通讯和对信息实时性要求比较高的应用.以前的服务器消息推送大部分采用的都是"轮询"和"长连接"技术,这两中技术都会对服务器产生相当大的开销,而且实时性不是特别高.WebSocket技术对只会产生很小的开销,并且实时性特别高.下面就开始讲解如何利用WebSocket技术开发聊天室.在这个实例中,采用的是Tomcat7服务器,每个服务器对于WebSoc

  • Java 网络编程socket编程等详解

    网络编程是指编写运行在多个设备(计算机)的程序,这些设备都通过网络连接起来. java.net包中J2SE的API包含有类和接口,它们提供低层次的通信细节.你可以直接使用这些类和接口,来专注于解决问题,而不用关注通信细节. java.net包中提供了两种常见的网络协议的支持: TCP: TCP是传输控制协议的缩写,它保障了两个应用程序之间的可靠通信.通常用于互联网协议,被称TCP / IP. UDP:UDP是用户数据报协议的缩写,一个无连接的协议.提供了应用程序之间要发送的数据的数据包. 本教程

  • 详解java WebSocket的实现以及Spring WebSocket

    开始学习WebSocket,准备用它来实现一个在页面实时输出log4j的日志以及控制台的日志. 首先知道一些基础信息: 1.java7 开始支持WebSocket,并且只是做了定义,并未实现 2.tomcat7及以上,jetty 9.1及以上实现了WebSocket,其他容器没有研究 3.spring 4.0及以上增加了WebSocket的支持 4.spring 支持STOMP协议的WebSocket通信 5.WebSocket 作为java的一个扩展,它属于javax包目录下,通常需要手工引入

  • Java中websocket消息推送的实现代码

    一.服务层 package com.demo.websocket; import java.io.IOException; import java.util.Iterator; import java.util.concurrent.ConcurrentLinkedQueue; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; import org.springframew

  • Java中用Socket实现HTTP文件上传实例

    我想做过web开发的程序员大部分都做过文件上传的功能,大多数时候我们都是借助于commons-fileupload这样的jar包实现的.下面我试着通过读取Socket的输入流来实现一个文件上传的功能. 在做文件上传之前我们需要先了解一下HTTP POST的附件上传协议.HTTP附件上传协议是RFC1876协议,RFC1876协议是在HTTP协议的基础上为INPUT标签增加了file属性,同时限定了Form的method必须为POST,ENCTYPE必须为multipart/form-data.R

  • 详解基于java的Socket聊天程序——客户端(附demo)

    写在前面: 上周末抽点时间把自己写的一个简单Socket聊天程序的初始设计和服务端细化设计记录了一下,周二终于等来毕业前考的软考证书,然后接下来就是在加班的日子度过了,今天正好周五,打算把客户端的详细设计和Common模块记录一下,因为这个周末开始就要去忙其他东西了. 设计: 客户端设计主要分成两个部分,分别是socket通讯模块设计和UI相关设计. 客户端socket通讯设计: 这里的设计其实跟服务端的设计差不多,不同的是服务端是接收心跳包,而客户端是发送心跳包,由于客户端只与一个服务端进行通

  • 关于Socket的解析以及双方即时通讯的java实现方法

    在Java编程之中,我们通常都会接触到网络编程,那么不可避免地就会接触到Socket通信,下面我将对Socket进行简单的解析,并给出双方通讯的代码实现方案 首先我们来介绍一下整个Socket的通信过程 首先服务端先创建一个SocketServer,那么创建一个SocketServer需要我们指定端口号,如下 ServerSocket serverSocket=new ServerSocket(8888); 像上面这样我们就简单的开了一个端口号为8888的ServerSocket了 接下来我们需

  • nodejs和react实现即时通讯简易聊天室功能

    npx create-react-app socketio-demo 进入socketio-demo目录 运行eject进行拆包,本项目也可以不拆,这是个人习惯. 注意如果运行eject命令最好在项目初始阶段执行,已经开始编写后不要再使用容易出现bug,新人谨慎使用eject命令 yarn eject 项目拆包后创建服务器文件夹和文件 mkdir server type null>index.js 创建完成后目录如下 编写即时通讯(聊天室)后台 安装nodejs插件 npm i express

  • Android Socket接口实现即时通讯实例代码

    Android Socket接口实现即时通讯 最近学习Android 通信的知识,做一个小实例,巩固下学习内容,以下内容是网上找的资料,觉得很不错,知识比较全面,大家看下. 首先了解一下即时通信的概念.通过消息通道 传输消息对象,一个账号发往另外一账号,只要账号在线,可以即时获取到消息,这就是最简单的即使通讯.消息通道可由TCP/IP UDP实现.通俗讲就是把一个人要发送给另外一个人的消息对象(文字,音视频,文件)通过消息通道(C/S实时通信)进行传输的服务.即时通讯应该包括四种形式,在线直传.

  • Python基于socket实现简单的即时通讯功能示例

    本文实例讲述了Python基于socket实现简单的即时通讯功能.分享给大家供大家参考,具体如下: 客户端tcpclient.py # -*- coding: utf-8 -*- import socket import threading # 目标地址IP/URL及端口 target_host = "127.0.0.1" target_port = 9999 # 创建一个socket对象 client = socket.socket(socket.AF_INET,socket.SOC

  • nodejs结合Socket.IO实现的即时通讯功能详解

    本文实例讲述了nodejs结合Socket.IO实现的即时通讯功能.分享给大家供大家参考,具体如下: 动态web 在html5以前,web的设计上并没有考虑过动态,他一直是围绕着文档设计的,我们看以前比较老的网站,基本上都是某一刻用来显示单一的文档的,用户请求一次web页面,获取一个页面,但是随着时间的推移,人们想要web做更多的事情了,而不是简单的要显示文档,而javaScript一直处于开发人员推动web页面功能的发展中心. Ajax无疑是动态Web页面的一个重大发展,他不再需要我们即使更新

  • koa socket即时通讯的示例代码

    前言 http的特点是一问一答,而即时通讯是需要双向通信的,这样以前的即时通信只能使用轮询的方式通过周期性的ajax请求获取数据,直到websocket出现,就完美实现了双向通信 一 即时通讯方式简介 段轮询 前台使用setInterval进行定时请求后台,这样无疑非常浪费性能 长轮询和长连接(html5的EventSource) 客服端连接一次,服务端不断开连接,服务端接收到新消息就发送给前台,客服端和服务端保持一直连接,缺点是只有服务端向客服端输出 websocket websocket不再

  • Python3 socket即时通讯脚本实现代码实例(threading多线程)

    Python 提供了两个级别访问的网络服务.: 低级别的网络服务支持基本的 Socket,它提供了标准的 BSD Sockets API,可以访问底层操作系统Socket接口的全部方法. 高级别的网络服务模块 SocketServer, 它提供了服务器中心类,可以简化网络服务器的开发. ------------------------------------------------服务端代码-------------------------------------- __author__ = "

  • nodejs结合Socket.IO实现websocket即时通讯

    目录 为什么要用 websocket Socket.io 开源项目 效果预览 app.js index.html 为什么要用 websocket websocket 是一种网络通信协议,一般用来进行实时通信会使用到. websocket 协议和 http 协议类似,http 协议有一个缺陷,只能由客户方端发起请求,服务端根据请求 url 和传过去的参数返回对应结果 websocket 是双向通信的,只要 websocket 连接建立起来,可以由客户端给服务端发送数据,也可以由服务端主动给客户端发

  • JavaScript实现即时通讯的 4 种方案

    目录 前言: 1. http + ajax 2. websocket 3. SSE 前言: 服务端如何将数据推送到浏览器,一般来说,Web端即时通讯技术因受限于浏览器的设计限制,一直以来实现起来并不容易,这里总结了4种方式. 1. http + ajax XMLHttpRequest在和服务端进行数据交互时存在四种状态,很多时候的判断是readyState为4时,从response获取服务端响应结果.其实readyState等于3的时候就可以获取到服务端的部分数据了. 可以利用这个属性实现服务端

  • NetCore WebSocket即时通讯示例

    NetCore WebSocket 即时通讯示例,供大家参考,具体内容如下 1.新建Netcore Web项目 2.创建简易通讯协议 public class MsgTemplate { public string SenderID { get; set; } public string ReceiverID { get; set; } public string MessageType { get; set; } public string Content { get; set; } } Se

随机推荐