Java Socket编程总结

 Socket的英文原意是“插座“,在编程语言中它被称为套接字。每台主机拥有多个插孔,各种外部通信设备通过这些插孔和主机联系。Java平台也集成了Socket,形成了一套独立的技术体系。在计算机网络中,网络传输协议主要包括TCP和UDP两种形式。UDP的优势是速度快,创建开销小,但是缺点也显而易见,就是不够安全,它只确包发送成功,但是并不确定接收者是否收到,所以在要求传输速率快,但是对安全性要求不高的情况下,选择UDP协议是个不错的选择,例如普通文件传输。对于安全性要求比较高的情况,还是建议用TCP协议,TCP协议采用三次握手,首先确定和接收方建立联系,如果收到反馈才会发送,如果发送出消息后,超出预定时间,便会重新发送,大家可以看到TCP比较麻烦。根据大家应该实际情况选择相应的传输协议。这里只是简介,如果大家对传输协议感兴趣,可以查阅相应的计算机网络方面的知识,下面言归正传,书归正文。

   Socket网络编程,要创建客户端和服务器端,从客户端传入数据,从服务器端接收数据。Socket的类提供了多个构造方法 ,比较常用的有Socket(InetAddress address, int port),第一个参数的含义是要发送到服务器端的IP地址,第二个是服务器端的端口号。一般端口号前0-1023是提供给底层操作系统所使用的,以上的端口可以供用户自由使用,不过要注意的是不要同一些常用的应用程序冲突,比如Tomcat的8080端口,微软产品Ms Visual Studio的1433端口等,如果端口被占用,可能会报refuse connection错误,下面会将常见的错误列举出来。

    服务器端Java代码:

//捕捉异常

private ServerSocket ss;
private Socket socket;
private BufferedReader in;
private PrintWriter out;

try
{

//创建一个ServerSocket对象,将它的端口设置为10000

ss = new ServerSocket(10000);


//连接多个客户端连接
while (true)
{

//accept是一个阻塞方法,如果接收不到来自客户端的申请,代码就不会向下执行
socket = ss.accept();

//下面将从socket中获取一个输入的字节流,将它转化为字符流,Java在转换流中采用的装饰者的设计模式,装饰者模式是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能

in = new BufferedReader(new InputStreamReader(socket.getInputStream()));

out = new PrintWriter(socket.getOutputStream(),true);
//将获取到的数据进行输出
String line = in.readLine();
out.println("you input is :" + line);
out.close();
in.close();
socket.close();
}
ss.close();
}
catch (IOException e)
{} 

服务器端代码更加简单

//xxx是所连服务器的IP地址,第二个参数是端口号,它要同服务器端一致

socket = new Socket("xxx.xxx.xxx.xxx", 10000);

//获得一个输入流

in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
out = new PrintWriter(socket.getOutputStream(),true); 

//从控制台输入信息

BufferedReader line = new BufferedReader(new InputStreamReader(System.in));
//将数据放入输出流中
out.println(line.readLine());

//此处一定不要忘了将所开启的流关闭,在Socketw网络编程中这是非常重要的,因为客户端的accept方法是阻塞的,如果不关闭流的话,accept就会陷入无线等待状态,造成//死锁,这也是常见的错误之一
line.close();
out.close();
in.close();
socket.close();
}
catch (IOException e)
{} 

下面列举一下Socket网络编程中常遇到的错误

(1)java.net.BindException:Address already in use: JVM_Bind。该异常发生在服务器端进行newServerSocket(port)(port 是一个0,65536 的整型值)操作时。异常的原因是以为与port 一样的一个端口已经被启动,并进行监听。只需要找一个没有被占用的端口就能解决这个问题。

(2)java.net.ConnectException: Connection refused: connect。该异常发生在客户端进行new Socket(ip, port)操作时,该异常发生的原因是或者具有ip 地址的机器不能找到(也就是说从当前机器不存在到指定ip 路由),或者是该ip 存在,但找不到指定的端口进行监听。出现该问题,首先检查客户端的ip 和port 是否写错了,如果正确则从客户端ping一下服务器看是否能ping 通,如果能ping 通(服务服务器端把ping 禁掉则需要另外的办法),则看在服务器端的监听指定端口的程序是否启动,这个肯定能解决这个问题。

(3)java.net.SocketException: Socket is closed,该异常在客户端和服务器均可能发生。异常的原因是己方主动关闭了连接后(调用了Socket 的close 方法)再对网络连接进行读写操作。

(4)java.net.SocketException: (Connection reset 或者Connect reset bypeer:Socket write error)。该异常在客户端和服务器端均有可能发生,引起该异常的原因有两个,第一个就是如果一端的Socket 被关闭(或主动关闭或者因为异常退出而引起的关闭),另一端仍发送数据,发送的第一个数据包引发该异常(Connect reset by peer)。另一个是一端退出,但退出时并未关闭该连接,另一端如果在从连接中读数据则抛出该异常(Connectionreset)。

(5)java.net.SocketException: Broken pipe。该异常在客户端和服务器均有可能发生。在第4 个异常的第一种情况中(也就是抛出SocketExcepton:Connect reset bypeer:Socket write error 后),如果再继续写数据则抛出该异常。前两个异常的解决方法是首先确保程序退出前关闭所有的网络连接,其次是要检测对方的关闭连接操作,发现对方关闭连接后自己也要关闭该连接。

  今天对于Socket编程的总结就写到这里,明天要参加软考,祝自己一切顺利,谢谢大家。微笑


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值