-
一个socket服务端长连接的编写需求5
现在正在写一个socket服务端,需求是:
1。客户只有一个,他的需求是当他发送一个报文到我的server端
2。我收到报文处理完后,不断开此连接一直等待,他也不会断开此连接。
3。客户端以后只用这一个连接想我发送消息。
请问这个服务端程序怎么写,我第一次写socket程序,还没入门,希望同学们帮我下。
问题补充:用java实现2013年10月24日 20:27
2个答案 按时间排序 按投票排序
-
nio
服务端:
public class NIOServer {
/**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
int port = 8888;
// 打开选择器
Selector selector = Selector.open();
// 打开服务器套接字通道
ServerSocketChannel ssc = ServerSocketChannel.open();
// 检索与此通道关联的服务器套接字
ServerSocket serverSocket = ssc.socket();
// 将 ServerSocket 绑定到特定地址(IP 地址和端口号)
serverSocket.bind(new InetSocketAddress(port));
System.out.println("server listen on port:" + port);
// 调整通道的阻塞模式
ssc.configureBlocking(false);
// 向给定的选择器注册此通道,返回一个选择键。SelectionKey.OP_ACCEPT--用于套接字接受操作的操作集位
ssc.register(selector, SelectionKey.OP_ACCEPT);
while (true) {
// timeout:为正,则在等待某个通道准备就绪时最多阻塞 timeout 毫秒;如果为零,则无限期地阻塞;必须为非负数
// int nKeys=selector.select(1000);或selector.select();
int nKeys = selector.select(1000);
if (nKeys == 0) {
continue;
}
//System.out.println(nKeys);
if (nKeys > 0) {
for (SelectionKey key : selector.selectedKeys()) {
/*
* 测试此键的通道是否已准备好接受新的套接字连接-- 如果此键的通道不支持套接字接受操作,则此方法始终返回 false
*/
if (key.isAcceptable()) {
ServerSocketChannel server = (ServerSocketChannel) key.channel();
SocketChannel sc = server.accept();
if (sc == null) {
continue;
}
sc.configureBlocking(false);
sc.register(selector, SelectionKey.OP_READ);
} else if (key.isReadable()) {
// 分配一个新的字节缓冲区
ByteBuffer buffer = ByteBuffer.allocate(1024);
SocketChannel sc = (SocketChannel) key.channel();
int readBytes = 0;
String message = null;
try {
int ret;
try {
while ((ret = sc.read(buffer)) > 0) {
readBytes += ret;
}
} catch (Exception e) {
sc.close();
readBytes = 0;
// ignore
} finally {
// 反转此缓冲区。首先对当前位置设置限制,然后将该位置设置为零
buffer.flip();
}
if (readBytes > 0) {
message = Charset.forName("UTF-8").decode(buffer).toString();
buffer = null;
}
} finally {
if (buffer != null) buffer.clear();
}
if (readBytes > 0) {
System.out.println("message from client:" + message);
if ("quit".equalsIgnoreCase(message.trim())) {
sc.close();
selector.close();
System.out.println("Server has been shutdown!");
System.exit(0);
}
String outMessage = "server response:" + message.toUpperCase();
sc.write(Charset.forName("UTF-8").encode(outMessage));
}else{
InetSocketAddress address1 = (InetSocketAddress)sc.socket().getRemoteSocketAddress();
System.out.print("IP地址:"+address1.getAddress()+"端口:"+address1.getPort());
System.out.println("远程强制断开!");
}
}
}
selector.selectedKeys().clear();
}
}
}
}
客户端:
public class NIOClient {
/**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
// 连接端口
int port = 8888;
SocketChannel channel = SocketChannel.open();
channel.configureBlocking(false);
// 指定连接地址及连接端口
SocketAddress target = new InetSocketAddress("127.0.0.1", port);
channel.connect(target);
Selector selector = Selector.open();
// 用于套接字连接操作的操作集位
channel.register(selector, SelectionKey.OP_CONNECT);
BufferedReader systemIn = new BufferedReader(new InputStreamReader(System.in));
while (true) {
if (channel.isConnected()) {
String command = systemIn.readLine();
channel.write(Charset.forName("UTF-8").encode(command));
if (command == null || "quit".equalsIgnoreCase(command.trim())) {
systemIn.close();
channel.close();
selector.close();
System.out.println("Client quit !");
System.exit(0);
}
}
int nKeys = selector.select();
if (nKeys > 0) {
for (SelectionKey key : selector.selectedKeys()) {
if (key.isConnectable()) {
SocketChannel sc = (SocketChannel) key.channel();
sc.configureBlocking(false);
sc.register(selector, SelectionKey.OP_READ);
sc.finishConnect();
} else if (key.isReadable()) {
ByteBuffer buffer = ByteBuffer.allocate(1024);
SocketChannel sc = (SocketChannel) key.channel();
int readBytes = 0;
try {
int ret = 0;
try {
while ((ret = sc.read(buffer)) > 0) {
readBytes += ret;
}
} finally {
buffer.flip();
}
if (readBytes > 0) {
System.out.println(Charset.forName("UTF-8").decode(buffer)
.toString());
buffer = null;
}
} finally {
if (buffer != null) {
buffer.clear();
}
}
}
}
selector.selectedKeys().clear();
}
}
}
}2013年10月25日 14:12
相关推荐
在基于Netty编写的socket服务端中,首先需要定义一个`ChannelHandler`,这个处理器负责处理接收到的网络事件,如连接建立、数据读取、连接关闭等。`ChannelHandlerContext`则是`ChannelHandler`和`ChannelPipeline`...
Java 编写基于 CMPP3.0 的 ...通过以上步骤,可以实现一个基于 Java Socket 和 CMPP3.0 协议的短信服务端和客户端,满足与移动运营商短信网关的通信需求。实际开发中,还需要结合具体业务场景进行适当的调整和扩展。
在这个“VB6.0简单Socket服务端”项目中,开发者使用了Winsock控件来实现了一个基本的Socket服务器。下面将详细解释Socket、Winsock控件以及如何在VB6.0中构建Socket服务端。 Socket,也称为套接字,是网络编程中的...
客户端首先会创建一个Socket,然后通过这个Socket向服务器发起连接请求。一旦连接建立,客户端就可以将序列化后的pb消息发送给服务器。服务端同样创建Socket监听特定端口,等待客户端的连接请求。当收到连接请求后,...
在本主题中,我们将深入探讨"socket服务端和客户端通讯"的核心概念、步骤以及关键知识点。 首先,Socket是Internet上的应用程序之间进行通信的一种机制,它提供了一种标准接口,使得应用层可以直接与传输层进行交互...
本文将深入探讨如何在QT中使用C++编写客户端和服务端的socket通信代码,以及涉及到的关键操作。 首先,我们需要理解Socket的基本概念。Socket是网络通信中的一个抽象接口,它提供了一种在不同进程间进行网络通信的...
在客户端方面,SuperSocket提供了一个SocketClient类,用于与服务端建立连接并进行数据交换。开发者可以通过继承这个基类,定制自己的客户端行为。在这个压缩包中,你将找到一个预先实现的Winform客户端,它演示了...
在这个"标准C实现的Socket服务端和客户端源码"中,我们可以深入学习和理解如何在C语言环境下编写Socket程序。以下是对相关知识点的详细说明: 1. **Socket基础知识**: Socket是一种在不同或相同计算机之间进行...
- 客户端也需要创建一个socket对象,然后使用`connect()`函数连接到服务端的指定地址和端口。 - `send()`函数用于向服务端发送数据,`recv()`用于接收服务端回应的数据。 - 客户端通常只有一个连接,但可以多次...
服务端也需要一个Socket对象监听特定端口等待客户端连接,并通过Accept方法接收连接请求。接收到数据后,通过Receive方法读取客户端发送的数据: ```csharp byte[] buffer = new byte[1024]; int received = ...
在本案例中,我们关注的是一个使用C#语言编写的Socket客户端代码,这通常用于实现客户端-服务器(C/S)架构的即时通讯系统。C#提供了丰富的.NET Framework类库,使得开发这样的客户端变得相对简单。 首先,`System...
【C#编写的Http服务端】是一个利用C#编程语言实现的HTTP服务器应用程序。C#是微软公司推出的面向对象的编程语言,它以其强大的功能、简洁的语法和丰富的类库在开发领域占据着重要的地位。在.NET框架的支持下,C#可以...
accept会从监听队列中取出一个连接请求,建立一个新的socket,专门用于处理这个连接,并返回新的socket描述符,而原始socket继续监听后续的连接请求。 客户端的连接过程则涉及到connect函数。客户端通过connect函数...
在标题中提到的"服务器_socket_delphi源码_服务端源码",这通常指的是一个使用Delphi编写的服务器端程序,该程序利用Socket API来监听和处理来自客户端的连接请求。在Delphi中,我们可以创建一个TIdServer或...
TCP服务端, 多个客户端通信",我们探讨的是如何使用Microsoft Visual Studio 2013中的MFC(Microsoft Foundation Classes)库,结合Socket编程技术,来实现一个TCP(Transmission Control Protocol)服务器,该...
- **接受连接**:调用`accept()`方法等待客户端连接,并返回一个新的Socket对象,表示客户端连接。 - **数据交换**:通过Socket的`InputStream`和`OutputStream`进行读写操作,实现数据传输。 4. **客户端实现**...
因为频繁需要测试网络连接,所以特意用QT编写了这个Socket工具,可使用TCP 以及 UDP 来建立服务端 和客户端等,涵盖大部分网络测试使用需求,使用 Qt 编写,无错误无警告,可直接编译运行。
每个连接可以由一个单独的线程来处理,确保服务响应的及时性。 - **ThreadPool**:C#中的ThreadPool类可以有效地管理线程资源,用于执行异步任务,如处理客户端的文件传输请求。 3. **文件操作**: - **...
本文将深入探讨如何利用MFC和SOCKET句柄来编写一个能进行网络通信的系统服务。 首先,理解MFC中的服务应用框架。在MFC中,我们可以利用CWinAppEx类来构建服务应用程序,通过重写OnRun()方法来处理服务的启动、停止...
首先,SuperSocket是一个轻量级的Socket服务端框架,它支持多种通信协议,如自定义协议、HTTP、FTP等。它的设计目标是提供一个易于扩展的平台,让开发者可以专注于业务逻辑,而不必关心底层Socket通信的复杂性。 **...