`
kree
  • 浏览: 127384 次
  • 性别: 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();

			}
		}
	}
}

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics