非阻塞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();

			}
		}
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值