热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

本篇文章主要介绍了关于Socket的解析以及双方通讯的java实现方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。在Java编程之中,我们通常都会接触到网络编程,那么不可避

本篇文章主要介绍了关于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()));//获得输出流 } //扫描键盘并输入数[email protected]*码网据 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进行简单的通信的实现就结束了~

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

以上就是关于Socket的解析以及双方即时通讯的java实现方法的详细内容,更多请关注gaodaima编程笔记其它相关文章!



推荐阅读
  • Java Socket 关键参数详解与优化建议
    Java Socket 的 API 虽然被广泛使用,但其关键参数的用途却鲜为人知。本文详细解析了 Java Socket 中的重要参数,如 backlog 参数,它用于控制服务器等待连接请求的队列长度。此外,还探讨了其他参数如 SO_TIMEOUT、SO_REUSEADDR 等的配置方法及其对性能的影响,并提供了优化建议,帮助开发者提升网络通信的稳定性和效率。 ... [详细]
  • 本文介绍了如何利用 Delphi 中的 IdTCPServer 和 IdTCPClient 控件实现高效的文件传输。这些控件在默认情况下采用阻塞模式,并且服务器端已经集成了多线程处理,能够支持任意大小的文件传输,无需担心数据包大小的限制。与传统的 ClientSocket 相比,Indy 控件提供了更为简洁和可靠的解决方案,特别适用于开发高性能的网络文件传输应用程序。 ... [详细]
  • Java能否直接通过HTTP将字节流绕过HEAP写入SD卡? ... [详细]
  • PHP 5.5.31 和 PHP 5.6.17 安全更新发布
    PHP 5.5.31 和 PHP 5.6.17 已正式发布,主要包含多个安全修复。强烈建议所有用户尽快升级至最新版本以确保系统安全。 ... [详细]
  • 兆芯X86 CPU架构的演进与现状(国产CPU系列)
    本文详细介绍了兆芯X86 CPU架构的发展历程,从公司成立背景到关键技术授权,再到具体芯片架构的演进,全面解析了兆芯在国产CPU领域的贡献与挑战。 ... [详细]
  • JUC(三):深入解析AQS
    本文详细介绍了Java并发工具包中的核心类AQS(AbstractQueuedSynchronizer),包括其基本概念、数据结构、源码分析及核心方法的实现。 ... [详细]
  • IOS Run loop详解
    为什么80%的码农都做不了架构师?转自http:blog.csdn.netztp800201articledetails9240913感谢作者分享Objecti ... [详细]
  • 本文总结了一些开发中常见的问题及其解决方案,包括特性过滤器的使用、NuGet程序集版本冲突、线程存储、溢出检查、ThreadPool的最大线程数设置、Redis使用中的问题以及Task.Result和Task.GetAwaiter().GetResult()的区别。 ... [详细]
  • 深入解析Android 4.4中的Fence机制及其应用
    在Android 4.4中,Fence机制是处理缓冲区交换和同步问题的关键技术。该机制广泛应用于生产者-消费者模式中,确保了不同组件之间高效、安全的数据传输。通过深入解析Fence机制的工作原理和应用场景,本文探讨了其在系统性能优化和资源管理中的重要作用。 ... [详细]
  • 深入剖析Java中SimpleDateFormat在多线程环境下的潜在风险与解决方案
    深入剖析Java中SimpleDateFormat在多线程环境下的潜在风险与解决方案 ... [详细]
  • 优化后的标题:深入探讨网关安全:将微服务升级为OAuth2资源服务器的最佳实践
    本文深入探讨了如何将微服务升级为OAuth2资源服务器,以订单服务为例,详细介绍了在POM文件中添加 `spring-cloud-starter-oauth2` 依赖,并配置Spring Security以实现对微服务的保护。通过这一过程,不仅增强了系统的安全性,还提高了资源访问的可控性和灵活性。文章还讨论了最佳实践,包括如何配置OAuth2客户端和资源服务器,以及如何处理常见的安全问题和错误。 ... [详细]
  • 本文探讨了如何利用Java代码获取当前本地操作系统中正在运行的进程列表及其详细信息。通过引入必要的包和类,开发者可以轻松地实现这一功能,为系统监控和管理提供有力支持。示例代码展示了具体实现方法,适用于需要了解系统进程状态的开发人员。 ... [详细]
  • 使用Maven JAR插件将单个或多个文件及其依赖项合并为一个可引用的JAR包
    本文介绍了如何利用Maven中的maven-assembly-plugin插件将单个或多个Java文件及其依赖项打包成一个可引用的JAR文件。首先,需要创建一个新的Maven项目,并将待打包的Java文件复制到该项目中。通过配置maven-assembly-plugin,可以实现将所有文件及其依赖项合并为一个独立的JAR包,方便在其他项目中引用和使用。此外,该方法还支持自定义装配描述符,以满足不同场景下的需求。 ... [详细]
  • Iwouldliketohaveatooltopdisplayedonatextboxunderacertainsituation.我希望在特定情况下在文本框中显示工具栏 ... [详细]
  • 在工业过程控制系统中,由于被控对象的环境比较恶劣,干扰源比较多,仪器、仪表采集的信息常会受到干扰,所以在模拟系统中,为了消除干扰,常采用RC滤波电路,而在由工业控制计算机组成的自动 ... [详细]
author-avatar
fangxiaoping47
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有