我们知道,TCP编程虽然在传输速度上不及UDP编程,但是,使用TCP编程可以保证数据在传输时的稳定性,而且TCP是建立在连接的基础之上的,因此,学习TCP编程,在网络编程中是十分重要的。那么,我们要了解TCP编程,就必须了解TCP协议编程在Java高级编程中的应用以及我们应当如何实现TCP协议编程。
同UDP协议编程一样,使用TCP协义编程,也是要在两个端口上实现的。不过在UDP中我们称作是发送端和接收端,而在TCP中我们称作是服务端和客户端。相同的是,在实现方式上,它们都是有规律可循、有步骤可以参考的。
首先,介绍一个实现TCP的服务端编程的一个重要的类ServerSocket:
编写TCP网络服务程序,首先要用到java.net.ServerSocket类用以创建服务器Socket
构造方法:
ServerSocket(intport):创建绑定到特定端口的服务器套接字
ServerSocket(intport, int backlog):利用指定的backlog(服务器忙时保持连接请求的等待客户数量),创建服务器套接字并将其绑定到指定的本地端口号。
ServerSocket(intport, int backlog, InetAddress bindAddr):使用指定的端口、侦听 backlog 和要绑定到的本地 IP 地址创建服务器。
在客户端,同样也有一个具有同等重要性的类:Socket
Socket:客户端要与服务器建立连接,必须先创建一个Socket对象
常用构造方法
Socket(Stringhost, int port):创建一个流套接字并将其连接到指定主机上的指定端口号。
Socket(InetAddressaddress, int port):创建一个流套接字并将其连接到指定 IP 地址的指定端口号。
服务器端程序调用ServerSocket类中的accept()方法等待客户端的连接请求,一旦accept()接收了客户端连接请求,该方法返回一个与该客户端建立了专线连接的Socket对象,不用程序去创建这个Socket对象。建立了连接的两个Socket是以IO流的方式进行数据交换的,Java提供了Socket类中的getInputStream()返回Socket的输入流对象,getOutputStream()返回Socket的输出流对象。
下面,以图示及说明的方式,介绍ServerSocket和Socket在实现网络编程的原理。
Server和Client端就相当于网络编程中的ServerSocket服务端和Socket客户端。
在服务端,通过ServerSocket的构造方法ServerSocket(int port):创建一个绑定到特定端口的服务器套接字对象,其中的port参数,是用以接受服务请求的指定端口,号然后
通过使用这个套接子对象的accept()方法实现对Socket客户端的监听,该方法返回一个Socket对象,无需特定的类来创建就可得到一个与客户端相同的类的的对象,该对象
是可以用来和Socket客户端进行交互的十分重要的。
同样,在客户端通过Socket(String host, int port):创建一个流套接字并将其连接到指定主机上的指定端口号。以实现同服务器连接的效果。
当在服务器端和Socket客户端都创建出了Socket对象时,我们就需要调用对象的相应方法来实现在服务器和客户端进行通信交互的目的。可以看到,通过服务器端的Socket对象的getOutputStream()和getInputStream()的方法与客户端的Socket对象的getInputStream()和getOutputStream()的方法是互逆的,这就像是一条通道,客户端就是通过这条通道实现与服务器端的交互的。
最后,当交互完成后要关闭两端的Socket接口。
关于实现Socket编程的具体步骤,如下图:
这里,举一个TCP服务器端程序的编写实例:
/*客户端通过键盘录入信息,发送到服务器端
服务器端收到信息后,将信息转为大写返回给客户端。*/
package net.csdn.socket;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Reader;
import java.net.ServerSocket;
import java.net.Socket;
public class TcpServer2 {
/**
* @param args
*/
publicstatic void main(String[] args) throws Exception{
ServerSocketss=new ServerSocket(9009);
Sockets=ss.accept();
System.out.println(s.getInetAddress().getHostAddress()+"...connection");
//读取客户的信息的输入流
InputStreamin=s.getInputStream();
BufferedReaderbrin=new BufferedReader(new InputStreamReader(in));
//向客户端发送信息输出流
BufferedWriter brout=new BufferedWriter(newOutputStreamWriter(s.getOutputStream()));
Stringline=null;
while((line=brin.readLine())!=null){
System.out.println("client:"+line);
brout.write(line.toUpperCase());
brout.newLine();
brout.flush();
}
s.close();
ss.close();
}
}
这样,就简单的实现了服务器端的程序的编写。
对于,TCP客户端程序的编写步骤,如图:
同样以另一个对应的客户端编程的实例来简单实现TCP协议编程在客户端的实。
package net.csdn.socket;
importjava.net.Socket;
import java.io.*;
public classTcpClient2 {
/**
* @param args
*/
public static void main(String[] args)throws Exception{
Socket s=newSocket("192.168.49.13",9009);
//获取键盘录入
BufferedReader br=newBufferedReader(new InputStreamReader(System.in));
//数据输出给服务器端
OutputStreamout=s.getOutputStream();
BufferedWriter bwout=newBufferedWriter(new OutputStreamWriter(out));
//获取服务器端返回的数据
BufferedReader brin=new BufferedReader(newInputStreamReader(s.getInputStream()));
String line=null;
while((line=br.readLine())!=null){
if(line.equals("over"))
break;
bwout.write(line);
bwout.newLine();
bwout.flush();
String str=brin.readLine();
System.out.println("server:"+str);
}
br.close();
s.close();
}
}