JAVA套接字实现简易的双人通信系统

JAVA套接字资料

socket是基于应用服务与TCP/IP通信之间的一个抽象,他将TCP/IP协议里面复杂的通信逻辑进行分装,对用户来说,只要通过一组简单的API就可以实现网络的连接。借用网络上一组socket通信图给大家进行详细讲解:

首先,服务端初始化ServerSocket,然后对指定的端口进行绑定,接着对端口及进行监听,通过调用accept方法阻塞,此时,如果客户端有一个socket连接到服务端,那么服务端通过监听和accept方法可以与客户端进行连接。

以上资料:

解决方案

综上所述,JAVA套接字需要一个SeverSocket对象作为服务端,监听Socket的连接请求,需要一个Socket对象作为客户端,向SeverSocket发送连接的请求。客户端和服务端建立连接后为全双工,两端均可接收和发送数据,接收和发送可以用流来实现。所以用SeverSocket和Socket分别作为两端进行通信。

但是如果两端仅仅用while循环来不停的发送和接收数据会发生阻塞,原因是因为一端只有完成发送操作后,才能开始接收操作,而键盘读取字符串的函数是阻塞的,socket流的读操作也会发生阻塞,所以只有键盘输入并按下回车,程序才会继续执行,另一端也相同。最终造成的结果是两端每次只能说一句话,说完后必须等待,只有接收到对方发来信息后,才可也说下一句。

解决方法就是利用多线程,服务端和客户端都设置两个线程,一个线程专门用来接收信息,一个专门用来发送信息。这样,接收和发送互不影响,消除阻塞。

主要代码块

服务端,接收客户端的连接请求,创建新的线程:

客户端,请求连接,并创建新的线程:

接收的线程:不断从输入流读取数据并打印

发送的线程:不断从键盘读取字符串并写入输出流

客户端和服务端的接收和发送进程基本相同

运行结果

最终代码

服务端

package com;

import java.io.IOException;

import java.io.*;

import java.net.*;

import java.util.Scanner;

public class Server{

static ServerSocket serverSocket;

public static void main(String[] args) {

try {

serverSocket = new ServerSocket(1515);

while(true) {

Socket accept_client = serverSocket.accept();

new Thread(new ServerIn(accept_client)).start();

new Thread(new ServerOut(accept_client)).start();

}

} catch (IOException e) {

e.printStackTrace();

try {

serverSocket.close();

} catch (IOException e1) {

// TODO Auto-generated catch block

e1.printStackTrace();

}

}

}

}

//接受的线程

class ServerIn implements Runnable{

Socket socket;

ServerIn(Socket socket){

this.socket = socket;

}

@Override

public void run() {

try {

InputStream in = socket.getInputStream();

while(true) {

byte infile[] = new byte[1024];

int size = in.read(infile);

String string = new String(infile,0,size);

if(!string.equals("") && !string.equals("\n")) System.out.println("message from client: "+ string);

}

} catch (IOException e) {

e.printStackTrace();

try {

socket.close();

} catch (IOException e1) {

e1.printStackTrace();

}

}

}

}

//发送的线程

class ServerOut implements Runnable{

Socket socket;

Scanner reader = new Scanner(System.in);

ServerOut(Socket socket){

this.socket = socket;

}

public void run() {

try {

OutputStreamWriter out = new OutputStreamWriter(socket.getOutputStream());

while(true) {

String string = reader.nextLine();

out.write(string);

out.flush();

}

} catch (IOException e) {

e.printStackTrace();

try {

socket.close();

reader.close();

} catch (IOException e1) {

e1.printStackTrace();

}

}

}

}

客户端

package com;

import java.io.*;

import java.util.*;

import java.net.*;

public class Client{

public static void main(String[] args) {

try {

Socket client = new Socket("127.0.0.1",1515);

new Thread(new ClientIn(client)).start();

new Thread(new ClientOut(client)).start();

} catch (IOException e) {

e.printStackTrace();

}

}

}

//接受的线程

class ClientIn implements Runnable{

Socket socket;

ClientIn(Socket socket){

this.socket = socket;

}

@Override

public void run() {

try {

InputStream in = socket.getInputStream();

while(true) {

byte infile[] = new byte[1024];

int size = in.read(infile);

String string = new String(infile,0,size);

if(!string.equals("") && !string.equals("\n")) System.out.println("message from server: "+ string);

}

} catch (IOException e) {

e.printStackTrace();

try {

socket.close();

} catch (IOException e1) {

e1.printStackTrace();

}

}

}

}

//发送的线程

class ClientOut implements Runnable{

Socket socket;

Scanner reader = new Scanner(System.in);

ClientOut(Socket socket){

this.socket = socket;

}

public void run() {

try {

OutputStreamWriter out = new OutputStreamWriter(socket.getOutputStream());

while(true) {

String string = reader.nextLine();

out.write(string);

out.flush();

}

} catch (IOException e) {

e.printStackTrace();

try {

socket.close();

reader.close();

} catch (IOException e1) {

e1.printStackTrace();

}

}

}

}

计算1913 李文轩

java套接字通信_JAVA套接字实现简易的双人通信系统相关推荐

  1. java套接字编程_Java套接字编程:教程

    java套接字编程 本教程是Java套接字编程的简介,从一个简单的客户机-服务器示例开始,该示例演示了Java I / O的基本功能. 将向您介绍原始的java.io软件包和NIO,即Java 1.4 ...

  2. Java套接字程序_java – 通过Web套接字进行应用程序到应用程序的通信

    我通过Web套接字(没有浏览器工作)获得应用程序到应用程序的通信有些麻烦.由于这似乎不是最常用的网络套接字应用程序,我想知道是否有人有这方面的经验. 为什么我要使用网络套接字? 由于防火墙问题,我需要 ...

  3. java 套接字是什么_套接字是什么,套接字通信及其原理

    为通信的端点,每个套接字由一个 IP 地址和一个端口号组成.通过网络通信的每对进程需要使用一对套接字,即每个进程各有一个. 通常,套接字采用客户机-服务器架构.服务器通过监听指定端口,来等待客户请求. ...

  4. Java知多少(105)套接字(Socket)

    网络应用模式主要有: 主机/终端模式:集中计算,集中管理: 客户机/服务器(Client/Server,简称C/S)模式:分布计算,分布管理: 浏览器/服务器模式:利用Internet跨平台. www ...

  5. Java基础23 网络编程 socket套接字流 TCP传输总结

    一.网络编程的概念 1.计算机网络:将不同地区的计算机,使用网络来进行连接 实现不同地区的数据的交互与共享(互联时代) 2. 网络编程的三要素:IP地址 端口号 协议 3. ip地址:是在网络连接中 ...

  6. 套接字是什么,套接字通信及其原理

    链接:http://c.biancheng.net/view/1210.html 套接字(socket)为通信的端点,每个套接字由一个 IP 地址和一个端口号组成.通过网络通信的每对进程需要使用一对套 ...

  7. 并发编程 - 协程 - 1.协程概念/2.greenlet模块/3.gevent模块/4.gevent实现并发的套接字通信...

    1.协程并发:切+保存状态单线程下实现并发:协程 切+ 保存状态 yield 遇到io切,提高效率 遇到计算切,并没有提高效率 检测单线程下 IO行为 io阻塞 切 相当于骗操作系统 一直处于计算协程 ...

  8. Python之路(第三十一篇) 网络编程:简单的tcp套接字通信、粘包现象

    一.简单的tcp套接字通信 套接字通信的一般流程 服务端 server = socket() #创建服务器套接字server.bind() #把地址绑定到套接字,网络地址加端口server.liste ...

  9. IPC——流套接字通信

    Linux进程间通信--使用流套接字 前面说到的进程间的通信,所通信的进程都是在同一台计算机上的,而使用socket进行通信的进程可以是同一台计算机的进程,也是可以是通过网络连接起来的不同计算机上的进 ...

最新文章

  1. linux hosts文件如何修改_如何修改hosts文件?让你简单方便快捷管理
  2. 功能强大的 C++ redis 客户端库增加至 acl 项目中
  3. java 数组group by_java Group by分组算法
  4. cesium添加填充_Cesium中级教程1 - 空间数据可视化(一)
  5. 实现一个简单的web服务器
  6. Ajax跨域请求解决方案——jsonp
  7. properties文件 , properties类, 的作用
  8. cocos2d-x 3.X (二)创建动起来的精灵
  9. JAVA基于权重的抽奖
  10. Opium推出针对跨链资产桥安全性的保险服务Bridge Protection
  11. java对象转excel_Java对象和Excel转换工具XXL-EXCEL
  12. wpf之MEF+MVVM结合
  13. supervisor来管理和监控进程
  14. paip.提升用户体验---网站程序HTML,JS需要注意的地方
  15. mysql主从不同步监控_MySQL主从同步监控
  16. Android ROM制作教程,让你拥有自己喜欢的ROM
  17. python科学计算第三版-python科学计算pdf下载
  18. c语言编译器官网,C语言编译器app_c语言编译器app官网下载_c语言编译器手机版app-多特软件站安卓网...
  19. php研究所 百科_松下幸之助_PHP研究所
  20. Deep Face Recognition读书笔记

热门文章

  1. Similarity and Matching of Neural Network Representations 论文阅读笔记
  2. 功能全面丰富优化 高德地图上线景区导览图及身边事功能
  3. Android Okhttp3 unable to load android socket classes
  4. C# Stream(学习笔记)
  5. 小程序token过期后, 实现无感知的刷新token
  6. Macbook pro安装windows双系统!
  7. php sms4,EAW SMS4 5寸壁挂音响
  8. 小程序生成分享海报,带二维码可携带参数!
  9. SLAM轨迹评估ATE和RPE
  10. 【SAP】ABAP开发——表维护视图事件(二)