当前位置: 首页 > 编程语言 > Java > 正文

Java编程那些事儿104——网络编程技术3

时间:2010-03-20 csdn 陈跃峰

为了一步一步的掌握网络编程,下面再研究网络编程中的两个基本问题,通过解决这两个问题将对网络编程的认识深入一层。

1、如何复用Socket连接?

在前面的示例中,客户端中建立了一次连接,只发送一次数据就关闭了,这就相当于拨打电话时,电话打通了只对话一次就关闭了,其实更加常用的应该是拨通一次电话以后多次对话,这就是复用客户端连接。

那么如何实现建立一次连接,进行多次数据交换呢?其实很简单,建立连接以后,将数据交换的逻辑写到一个循环中就可以了。这样只要循环不结束则连接就不会被关闭。按照这种思路,可以改造一下上面的代码,让该程序可以在建立连接一次以后,发送三次数据,当然这里的次数也可以是多次,示例代码如下:

package tcp;
import java.io.*;
import java.net.*;
/**
* 复用连接的Socket客户端
* 功能为:发送字符串“Hello”到服务器端,并打印出服务器端的反馈
*/
public class MulSocketClient {
 public static void main(String[] args) {
  Socket socket = null;
  InputStream is = null;
  OutputStream os = null;
  //服务器端IP地址
  String serverIP = "127.0.0.1";
  //服务器端端口号
  int port = 10000;
  //发送内容
  String data[] ={"First","Second","Third"};
  try {
   //建立连接
   socket = new Socket(serverIP,port);
   //初始化流
   os = socket.getOutputStream();
   is = socket.getInputStream();
   byte[] b = new byte[1024];
   for(int i = 0;i < data.length;i++){
    //发送数据
    os.write(data[i].getBytes());
    //接收数据
    int n = is.read(b);
    //输出反馈数据
    System.out.println("服务器反馈:" + new String(b,0,n));
   }
  } catch (Exception e) {
    e.printStackTrace(); //打印异常信息
  }finally{
    try {
     //关闭流和连接
     is.close();
     os.close();
     socket.close();
    } catch (Exception e2) {}
  }
 }
}

该示例程序和前面的代码相比,将数据交换部分的逻辑写在一个for循环的内容,这样就可以建立一次连接,依次将data数组中的数据按照顺序发送给服务器端了。

如果还是使用前面示例代码中的服务器端程序运行该程序,则该程序的结果是:

java.net.SocketException: Software caused connection abort: recv failed
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(SocketInputStream.java:129)
at java.net.SocketInputStream.read(SocketInputStream.java:90)
at tcp.MulSocketClient.main(MulSocketClient.java:30)

服务器反馈:First

显然,客户端在实际运行时出现了异常,出现异常的原因是什么呢?如果仔细阅读前面的代码,应该还记得前面示例代码中的服务器端是对话一次数据以后就关闭了连接,如果服务器端程序关闭了,客户端继续发送数据肯定会出现异常,这就是出现该问题的原因。