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

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

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

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

时间: 2025-01-08 04:27:04

Java编程那些事儿104——网络编程技术3的相关文章

Java编程那些事儿105——网络编程技术4

13.2.4 UDP编程 网络通讯的方式除了TCP方式以外,还有一种实现的方式就是UDP方式.UDP(User Datagram Protocol),中文意思是用户数据报协议,方式类似于发短信息,是一种物美价廉的通讯方式,使用该种方式无需建立专用的虚拟连接,由于无需建立专用的连接,所以对于服务器的压力要比TCP小很多,所以也是一种常见的网络编程方式.但是使用该种方式最大的不足是传输不可靠,当然也不是说经常丢失,就像大家发短信息一样,理论上存在收不到的可能,这种可能性可能是1%,反正比较小,但是由

Java编程那些事儿9——网络编程基础

对于初学者,或者没有接触过网络编程的程序员,会觉得网络编程涉及的知识很高深,很难,其实这是一种误解,当你的语法熟悉以后,其实基本的网络编程现在已经被实现的异常简单了. 1.4.1 网络编程是什么? 网络编程的本质是两个设备之间的数据交换,当然,在计算机网络中,设备主要指计算机.数据传递本身没有多大的难度,不就是把一个设备中的数据发送给两外一个设备,然后接受另外一个设备反馈的数据. 现在的网络编程基本上都是基于请求/响应方式的,也就是一个设备发送请求数据给另外一个,然后接收另一个设备的反馈. 在网

Java编程那些事儿102——网络编程技术1

13.2 网络编程技术 前面介绍了网络编程的相关基础知识,初步建立了网络编程的概念,但是实际学习网络编程还必须使用某种程序设计语言进行代码实现,下面就介绍一下网络编程的代码实现. 13.2.1 网络编程步骤 按照前面的基础知识介绍,无论使用TCP方式还是UDP方式进行网络通讯,网络编程都是由客户端和服务器端组成.当然,B/S结构的编程中只需要实现服务器端即可.所以,下面介绍网络编程的步骤时,均以C/S结构为基础进行介绍. 说明:这里的步骤实现和语言无关,也就是说,这个步骤适用于各种语言实现,不局

Java编程那些事儿103——网络编程技术2

13.2.3 TCP编程 按照前面的介绍,网络通讯的方式有TCP和UDP两种,其中TCP方式的网络通讯是指在通讯的过程中保持连接,有点类似于打电话,只需要拨打一次号码(建立一次网络连接),就可以多次通话(多次传输数据).这样方式在实际的网络编程中,由于传输可靠,类似于打电话,如果甲给乙打电话,乙说没有听清楚让甲重复一遍,直到乙听清楚为止,实际的网络传输也是这样,如果发送的一方发送的数据接收方觉得有问题,则网络底层会自动要求发送方重发,直到接收方收到为止. 在Java语言中,对于TCP方式的网络编

Java编程那些事儿101——网络编程概述

第十三章 网络编程 网络编程对于很多的初学者来说,都是很向往的一种编程技能,但是很多的初学者却因为很长一段时间无法进入网络编程的大门而放弃了对于该部分技术的学习. 在学习网络编程以前,很多初学者可能觉得网络编程是比较复杂的系统工程,需要了解很多和网络相关的基础知识,其实这些都不是很必需的.首先来问一个问题:你会打手机吗?很多人可能说肯定会啊,不就是按按电话号码,拨打电话嘛,很简单的事情啊!其实初学者如果入门网络编程的话也可以做到这么简单! 网络编程就是在两个或两个以上的设备(例如计算机)之间传输

Java编程那些事儿110——网络编程小结

13.4 中文问题 网络传输过程中的中文问题也比较突出,出现该问题的原因和前面IO部分介绍的一致,都是由于传输过程中客户端程序和服务器端程序采用的字符集不一致,在解决该问题以前首先进行如下的思考: 是否在网络中一定要传输中文字符? 从前面的示例中可以看出,通过一定的协议格式设计,可以避免在网络中传输中文字符,这样就从基础上避免了中文问题的出现.例如在程序中需要传输"成功"."失败"这样的中文字符串,在协议中可以约定数字0代表"成功".1代表&qu

Java编程那些事儿108——网络编程示例1

13.3 网络编程示例 "实践出真知",所以在进行技术学习时,还是需要进行很多的练习,才可以体会技术的奥妙,下面通过两个简单的示例,演示网络编程的实际使用. 13.3.1质数判别示例 该示例实现的功能是质数判断,程序实现的功能为客户端程序接收用户输入的数字,然后将用户输入的内容发送给服务器端,服务器端判断客户端发送的数字是否是质数,并将判断的结果反馈给客户端,客户端根据服务器端的反馈显示判断结果. 质数的规则是:最小的质数是2,只能被1和自身整除的自然数.当用户输入小于2的数字,以及输

Java编程那些事儿106——网络编程技术5

该示例的功能是实现将客户端程序的系统时间发送给服务器端,服务器端接收到时间以后,向客户端反馈字符串"OK".实现该功能的客户端代码如下所示: package udp; import java.net.*; import java.util.*; /** * 简单的UDP客户端,实现向服务器端发生系统时间功能 */ public class SimpleUDPClient { public static void main(String[] args) { DatagramSocket

Java编程那些事儿109——网络编程示例2

13.3.2 猜数字小游戏 下面这个示例是一个猜数字的控制台小游戏.该游戏的规则是:当客户端第一次连接到服务器端时,服务器端生产一个「0,50」之间的随机数字,然后客户端输入数字来猜该数字,每次客户端输入数字以后,发送给服务器端,服务器端判断该客户端发送的数字和随机数字的关系,并反馈比较结果,客户端总共有5次猜的机会,猜中时提示猜中,当输入"quit"时结束程序. 和前面的示例类似,在进行网络程序开发时,首先需要分解一下功能的实现,觉得功能是在客户端程序中实现还是在服务器端程序中实现.