java套接字通信_JAVA套接字实现简易的双人通信系统
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套接字实现简易的双人通信系统相关推荐
- java套接字编程_Java套接字编程:教程
java套接字编程 本教程是Java套接字编程的简介,从一个简单的客户机-服务器示例开始,该示例演示了Java I / O的基本功能. 将向您介绍原始的java.io软件包和NIO,即Java 1.4 ...
- Java套接字程序_java – 通过Web套接字进行应用程序到应用程序的通信
我通过Web套接字(没有浏览器工作)获得应用程序到应用程序的通信有些麻烦.由于这似乎不是最常用的网络套接字应用程序,我想知道是否有人有这方面的经验. 为什么我要使用网络套接字? 由于防火墙问题,我需要 ...
- java 套接字是什么_套接字是什么,套接字通信及其原理
为通信的端点,每个套接字由一个 IP 地址和一个端口号组成.通过网络通信的每对进程需要使用一对套接字,即每个进程各有一个. 通常,套接字采用客户机-服务器架构.服务器通过监听指定端口,来等待客户请求. ...
- Java知多少(105)套接字(Socket)
网络应用模式主要有: 主机/终端模式:集中计算,集中管理: 客户机/服务器(Client/Server,简称C/S)模式:分布计算,分布管理: 浏览器/服务器模式:利用Internet跨平台. www ...
- Java基础23 网络编程 socket套接字流 TCP传输总结
一.网络编程的概念 1.计算机网络:将不同地区的计算机,使用网络来进行连接 实现不同地区的数据的交互与共享(互联时代) 2. 网络编程的三要素:IP地址 端口号 协议 3. ip地址:是在网络连接中 ...
- 套接字是什么,套接字通信及其原理
链接:http://c.biancheng.net/view/1210.html 套接字(socket)为通信的端点,每个套接字由一个 IP 地址和一个端口号组成.通过网络通信的每对进程需要使用一对套 ...
- 并发编程 - 协程 - 1.协程概念/2.greenlet模块/3.gevent模块/4.gevent实现并发的套接字通信...
1.协程并发:切+保存状态单线程下实现并发:协程 切+ 保存状态 yield 遇到io切,提高效率 遇到计算切,并没有提高效率 检测单线程下 IO行为 io阻塞 切 相当于骗操作系统 一直处于计算协程 ...
- Python之路(第三十一篇) 网络编程:简单的tcp套接字通信、粘包现象
一.简单的tcp套接字通信 套接字通信的一般流程 服务端 server = socket() #创建服务器套接字server.bind() #把地址绑定到套接字,网络地址加端口server.liste ...
- IPC——流套接字通信
Linux进程间通信--使用流套接字 前面说到的进程间的通信,所通信的进程都是在同一台计算机上的,而使用socket进行通信的进程可以是同一台计算机的进程,也是可以是通过网络连接起来的不同计算机上的进 ...
最新文章
- linux hosts文件如何修改_如何修改hosts文件?让你简单方便快捷管理
- 功能强大的 C++ redis 客户端库增加至 acl 项目中
- java 数组group by_java Group by分组算法
- cesium添加填充_Cesium中级教程1 - 空间数据可视化(一)
- 实现一个简单的web服务器
- Ajax跨域请求解决方案——jsonp
- properties文件 , properties类, 的作用
- cocos2d-x 3.X (二)创建动起来的精灵
- JAVA基于权重的抽奖
- Opium推出针对跨链资产桥安全性的保险服务Bridge Protection
- java对象转excel_Java对象和Excel转换工具XXL-EXCEL
- wpf之MEF+MVVM结合
- supervisor来管理和监控进程
- paip.提升用户体验---网站程序HTML,JS需要注意的地方
- mysql主从不同步监控_MySQL主从同步监控
- Android ROM制作教程,让你拥有自己喜欢的ROM
- python科学计算第三版-python科学计算pdf下载
- c语言编译器官网,C语言编译器app_c语言编译器app官网下载_c语言编译器手机版app-多特软件站安卓网...
- php研究所 百科_松下幸之助_PHP研究所
- Deep Face Recognition读书笔记
热门文章
- Similarity and Matching of Neural Network Representations 论文阅读笔记
- 功能全面丰富优化 高德地图上线景区导览图及身边事功能
- Android Okhttp3 unable to load android socket classes
- C# Stream(学习笔记)
- 小程序token过期后, 实现无感知的刷新token
- Macbook pro安装windows双系统!
- php sms4,EAW SMS4 5寸壁挂音响
- 小程序生成分享海报,带二维码可携带参数!
- SLAM轨迹评估ATE和RPE
- 【SAP】ABAP开发——表维护视图事件(二)