socket 非阻塞即时通讯

本文介绍了一个基于Java的即时通讯系统实现,该系统利用非NIO方式通过创建多个线程来处理客户端和服务端的数据收发。具体而言,系统包含Server端与Client端两个部分,各自启动发送和接收两个线程,确保了数据的双向即时传输。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

socket(非NIO)是阻塞的,这里使用多线程实现非阻塞即时通讯。每个请求都要创建个新的线程,资源消耗很大,适用于小数据量操作。包括四个文件:Server.java,Client.java,Send.java,Print.java.


1.Server.java:

package com.lcq.socket;


import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;


public class Server {


public static void main(String[] args) {
ServerSocket serverSocket;
Socket socket;
try {
System.out.println("服务器启动。。。");
serverSocket = new ServerSocket(9000);
socket = serverSocket.accept();
System.out.println("服务端连接成功");

DataInputStream dataInputStream = new DataInputStream(socket.getInputStream());
DataOutputStream dataOutputStream = new DataOutputStream(socket.getOutputStream());

SendThread sendThread = new SendThread(dataOutputStream);
PrintThread printThread = new PrintThread(dataInputStream, "127.0.0.1");

Thread send = new Thread(sendThread);
Thread print = new Thread(printThread);

send.start();
print.start();

} catch (IOException e) {
e.printStackTrace();
}

}
}


2.Client.java

package com.lcq.socket;


import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;


public class Client {

public static void main(String[] args) {
try {
Socket socket = new Socket("127.0.0.1", 9000);
DataInputStream dataInputStream = new DataInputStream(socket.getInputStream());
DataOutputStream dataOutputStream = new DataOutputStream(socket.getOutputStream());

SendThread sendThread = new SendThread(dataOutputStream);
PrintThread printThread = new PrintThread(dataInputStream, "127.0.0.1");

Thread send = new Thread(sendThread);
Thread print = new Thread(printThread);

send.start();
print.start();

} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}

}
}


3.SendThread:

package com.lcq.socket;


import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.InputStreamReader;


public class SendThread implements Runnable {


private DataOutputStream dataOutputStream;


public SendThread(DataOutputStream dataOutputStream) {
super();
this.dataOutputStream = dataOutputStream;
}


@Override
public void run() {
BufferedReader bufferedReader = null;
while (true) {
try {
bufferedReader = new BufferedReader(new InputStreamReader(
System.in));
String line = bufferedReader.readLine();
if (line != null) {
dataOutputStream.writeUTF(line);
}
} catch (Exception e) {
break;



}
}


}


4.Print.java:

package com.lcq.socket;


import java.io.DataInputStream;
import java.io.IOException;


public class PrintThread implements Runnable{

private String ip = null;
private DataInputStream dataInputStream;
public PrintThread(DataInputStream dataInputStream,String ip){
super();
this.dataInputStream = dataInputStream;
this.ip = ip;
}

@Override
public void run() {
while(true){
try {
String line = dataInputStream.readUTF();
System.out.println(ip+":"+line);
} catch (IOException e) {
break;
}

}

}


}

最新版Socket编程,后面带有程序实例,并通过调试,可以直接编译运行;希望对大家有帮助。代码设计服务端、客户端socket实例,设计IPV4、IPV6的实例代码。 网络的Socket数据传输是一种特殊的I/O,Socket也是一种文件描述符。Socket也具有一个类似于打开文件的函数调用Socket(),该函数返回一个整型的Socket描述符,随后的连接建立、数据传输等操作都是通过该Socket实现的。 部分代码(服务器): #include #include #include #include #include #include #include #include #define SERVPORT 3333 /*服务器监听端口号 */ #define BACKLOG 10 /* 最大同时连接请求数 */ main() { int sockfd,client_fd; /*sockfd:监听socket;client_fd:数据传输socket */ struct sockaddr_in my_addr; /* 本机地址信息 */ struct sockaddr_in remote_addr; /* 客户端地址信息 */ if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) { perror( "socket创建出错!"); exit(1); } my_addr.sin_family=AF_INET; my_addr.sin_port=htons(SERVPORT); my_addr.sin_addr.s_addr = INADDR_ANY; bzero( &(my_addr.sin_zero),8); if (bind(sockfd, (struct sockaddr *) &my;_addr, sizeof(struct sockaddr)) == -1) { perror( "bind出错!"); exit(1); } if (listen(sockfd, BACKLOG) == -1) { perror( "listen出错!"); exit(1); } while(1) { sin_size = sizeof(struct sockaddr_in); if ((client_fd = accept(sockfd, (struct sockaddr *) &remote;_addr, &sin;_size)) == -1) { perror( "accept出错"); continue; } printf( "received a connection from %s\n", inet_ntoa(remote_addr.sin_addr)); if (!fork()) { /* 子进程代码段 */ if (send(client_fd, "Hello, you are connected!\n", 26, 0) == -1) perror( "send出错!"); close(client_fd); exit(0); } close(client_fd); } } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值