`
kree
  • 浏览: 129235 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

非阻塞Socket客户端程序

阅读更多
import java.nio.*;
import java.nio.channels.*;
import java.net.*;
import java.io.*;
import java.nio.charset.*;

public class Client {
	public SocketChannel client = null;
	public InetSocketAddress isa = null;
	public RecvThread rt = null;

	public Client() {
	}

	public void makeConnection() {
		int result = 0;
		try {
			client = SocketChannel.open();
			isa = new InetSocketAddress("localhost", 9000);
			client.connect(isa);
			client.configureBlocking(false);
			receiveMessage();
		} catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		result = sendMessage();
		while (result != -1) {
		}
		try {
			client.close();
			System.exit(0);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	public int sendMessage() {
		System.out.println("Inside SendMessage");
		BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
		String msg = null;
		ByteBuffer bytebuf = ByteBuffer.allocate(1024);
		int nBytes = 0;
		try {
			msg = in.readLine();
			System.out.println("msg is " + msg);
			bytebuf = ByteBuffer.wrap(msg.getBytes());
			nBytes = client.write(bytebuf);
			System.out.println("nBytes is " + nBytes);
			if (msg.equals("quit") || msg.equals("shutdown")) {
				System.out.println("time to stop the client");
				interruptThread();
				try {
					Thread.sleep(5000);
				} catch (Exception e) {
					e.printStackTrace();
				}
				client.close();
				return -1;
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
		System.out.println("Wrote " + nBytes + " bytes to the server");
		return nBytes;
	}

	public void receiveMessage() {
		rt = new RecvThread("Receive THread", client);
		rt.start();
	}

	public void interruptThread() {
		rt.val = false;
	}

	public static void main(String args[]) {
		Client cl = new Client();
		cl.makeConnection();
	}

	public class RecvThread extends Thread {
		public SocketChannel sc = null;
		public boolean val = true;
		public RecvThread(String str, SocketChannel client) {
			super(str);
			sc = client;
		}

		public void run() {
			System.out.println("Inside receivemsg");
			int nBytes = 0;
			ByteBuffer buf = ByteBuffer.allocate(2048);
			try {
				while (val) {
					nBytes = client.read(buf);
					while (nBytes > 0) {
						buf.flip();
						Charset charset = Charset.forName("gb2312");
						CharsetDecoder decoder = charset.newDecoder();
						CharBuffer charBuffer = decoder.decode(buf);
						String result = charBuffer.toString();
						System.out.println(result);
						buf.flip();

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

			}
		}
	}
}

 

分享到:
评论

相关推荐

    Socket C++ TCP阻塞\非阻塞 服务器 客户端 开发

    ### Socket C++ TCP阻塞与非阻塞服务器客户端开发 #### 概述 本文档将详细介绍如何使用C++ Winsock库来开发TCP非阻塞服务器。通过本篇内容的学习,您将了解到设置socket函数为非阻塞模式的方法,并且能够深入了解...

    MFC实现非阻塞Socket通信

    本文将深入探讨如何使用MFC实现非阻塞Socket通信,并结合protobuf(Protocol Buffers)作为数据交换格式,构建一个允许多个客户端与单一服务器进行通信的系统。 首先,我们来理解“非阻塞Socket”。在传统的阻塞...

    Linux下的Socket编程实例(阻塞和非阻塞)

    阻塞和非阻塞Socket Socket 编程中有两种方式:阻塞(Blocking)和非阻塞(Non-Blocking)。阻塞 Socket 指的是在执行某个操作时,程序将等待该操作完成,而非阻塞 Socket 则可以继续执行其他操作,不会被阻塞。 ...

    java socket 客户端代码

    此外,还可以考虑使用NIO(非阻塞I/O)或异步I/O来提高性能和可扩展性。 记住,为了使客户端运行,服务器端也需要有相应的Socket服务,监听指定的端口并处理来自客户端的连接和数据。这通常涉及到创建一个`...

    非阻塞模式socket程序

    回调函数在非阻塞Socket编程中起着关键作用。当接收到数据或发生特定事件(如连接、断开连接)时,程序会通过预先注册的回调函数通知应用层。这种方式使得处理网络事件更加灵活,应用可以根据自身需求定制事件处理...

    windows的阻塞和非阻塞Socket编程

    非阻塞Socket(Non-blocking Socket)则提供了另一种解决方案。在非阻塞模式下,当尝试读取数据但缓冲区为空,或者尝试写入但网络不可写时,recv()和send()函数并不会挂起,而是立即返回一个错误代码。开发者需要...

    android基于WiFi的socket客户端和服务器端

    9. **性能优化**:对于大量数据传输,可以考虑使用缓冲区优化读写效率,或者使用NIO(非阻塞I/O)提高并发性能。 通过以上步骤和注意事项,我们可以创建出能在Android设备上运行的基于WiFi的Socket客户端和服务器端...

    异步非阻塞socket聊天室程序

    "异步非阻塞socket聊天室程序"是一个使用C++语言,并基于MFC(Microsoft Foundation Classes)库构建的项目,旨在实现高效的多用户通信。下面将详细阐述这个程序背后的关键知识点。 首先,我们关注的是"异步非阻塞...

    自己写的socket 客户端 服务器聊天demo

    通过分析和运行这些代码,开发者可以更直观地了解非阻塞Socket通信的工作流程。 总的来说,这个"自己写的socket 客户端 服务器聊天demo"是一个实用的学习资源,对于理解Socket编程和非阻塞I/O模式有极大的帮助。...

    无阻塞Socket服务端、客户端示例

    一旦连接成功,客户端也可以设置Socket为非阻塞模式,使用send()发送数据,recv()接收数据,同样需要处理可能的无数据可读或无法写入的情况。 `SocketNB.sln`是Visual Studio的解决方案文件,包含了项目配置信息;`...

    C#Socket客户端.zip

    标题"C# Socket客户端.zip"暗示了这是一个关于使用C#编写Socket客户端程序的资源包。客户端通常用于发起连接请求,与服务器建立连接后,可以发送和接收数据。以下是一些关键知识点: 1. **建立连接**:在C#中,创建...

    C++ socket 阻塞与非阻塞

    本话题主要探讨的是在C++ Socket编程中的阻塞模式与非阻塞模式,以及它们在多线程环境下的应用和资源管理。 一、阻塞与非阻塞模式 1. **阻塞模式**:在阻塞模式下,当一个Socket调用(如recv或send)执行时,如果...

    python多线程非阻塞socket

    非阻塞Socket允许Socket在等待数据时不会被挂起,而是立即返回,这样可以提高系统的整体效率。 在Python中,我们可以使用`threading`模块来创建和管理线程。创建一个线程的基本步骤包括定义一个运行函数,然后创建...

    非阻塞Socket的应用

    非阻塞Socket是一种在计算机网络编程中常用的通信机制,它允许程序在等待数据或完成I/O操作时,不被阻塞而能继续执行其他任务。这种模式与传统的阻塞Socket相反,阻塞Socket会在发送、接收数据或者连接、断开连接时...

    C++ TCP客户端非阻塞连接超时测试源码

    "ConsoleApplication2"源码很可能包含了一个简单的C++客户端程序,它利用非阻塞模式尝试连接到指定的服务器,并在连接失败或超时时进行重试。程序可能使用了套接字API(如`socket()`, `fcntl()`, `connect()`, `...

    socket 多线程 例程 非阻塞模式

    这个示例中的源代码包含了客户端和服务器端的实现,通过运行这些代码,你可以实际观察到多线程非阻塞模式下的socket通信。客户端发送数据到服务器,而服务器接收并回应,整个过程是并行且高效的。 总之,"socket多...

    C++封装类CWSocket(多线程 非阻塞)

    通过阅读和分析这些代码,我们可以深入了解如何在C++中实现多线程、非阻塞的socket类,以及如何添加超时控制。 总的来说,C++封装类CWSocket的实现结合了多线程、非阻塞I/O和超时处理等关键技术,旨在提供一个高效...

    Socket客户端

    这种方式提高了程序的效率,适合处理高并发和非阻塞的需求。 Socket客户端的基本操作流程通常包括以下几个步骤: 1. **创建Socket**:客户端首先需要创建一个Socket对象,这是所有Socket操作的基础。 2. **连接...

    socket 客户端

    Socket客户端是计算机网络编程中的一个重要概念,主要用于实现应用程序间的通信。在本文中,我们将深入探讨Socket客户端的工作原理、如何向服务端发送数据以及接收服务端响应消息的过程。 首先,Socket是一种网络...

    linux客户端Socket非阻塞connect编程[归纳].pdf

    Linux 客户端Socket 非阻塞 connect 编程详解 本文档详细介绍了 Linux 客户端 Socket 非阻塞 connect 编程的实现方法和原理。非阻塞 connect 是一种高效的网络编程技术,能够提高程序的性能和可靠性。 一、非阻塞 ...

Global site tag (gtag.js) - Google Analytics