socket连接

最近找了找方向,随便翻了翻书,先写一些和主线无关的吧,socket连接的使用。
首先,如何连接远端的网络服务器。
先从最基本的说起:
Socket s = new Socket(...);
as.setSoTimaOut(1000);
try{
InputStream in = s.getInputStream();
} catch(InterruptedIOException exception) {
react to timeout
}

此代码有一个问题,如果使用new socket(String host, int port)这个构造器的话,会一直无限期阻塞下去,直到建立连接成功。所以推荐做法为:
Socket s = new Socket();
s.connect(new InetSocketAddress(host, port), timeout);

其实,java封装了所有连接服务器的细节,所以,我们使用起来会非常的方便。
网络地址一般的获得方式为
InetAddress address = InetAddress.getByName("www.baidu.com");
byte[] addressBytes = address.getAddress();
//如果很多ip来实现负载均衡,则会有很多主机地址
byte[] address = InetAddress.getAllByNames(hst);

讲完客户端,服务端也要讲了,首先还是最基本的:

ServerSocket s = new ServerSocket(8199);
//下面的命令一下,你的程序就被hold住了哦
Socket incoming = s.accept();
//直到程序有了输入
try{
InputStream inStream = incoming.getInputStream();
OutputStream outStream = incoming.getOutputStream();
Scanner in = new Scanner(inStream);
PrintWriter out = new PrintWriter(outStream, true);

out.print;n("Hello! Enter BYE to exit.");

boolean done = false;
while(!done && in.hasNextLine()){
String line = in.nextLine();
out.println("Echo" + line);
if (line.trim().equals("BYTE")) done = true;
}
} finally {
incoming.close();
}
catch(IOException e) {
xxxx
}
}

一般情况,服务器不可能一对一的应对访问,所以需要线程加以支撑:
替换相应的s.accept()
while(true){
Socket incoming = s.accept();
Runnable r = new ThreadedEchoHandler(incoming);
Thread t = new Thread(r);
t.start();
i++;
}

这样服务器端就可以处理多个客户端的请求了。

下来,还有一个问题,如果客户端想在建立连接的时候中断请求,应该怎么办呢?有一法:
可以使用java.nio包提供的一个特性:SocketChannel类。
SocketChannel channel = SocketChannel.open(new InetSocketAddress(host, port));
Scanner in = new Scanner(channel);
//Channels的静态方法
OutputStream outputStream = Channels.newOutputStream(channel);

这样,如果使用线程的中断interrupt(),那么线程将不会陷入阻塞,而是以异常的方式结束。具体客户端的访问线程是否可以从访问处直接到异常处,各位自己写写程序实验吧。睡觉!呵呵。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值