1、tcp连接的特点及一般应用范围
tcp是一种面向连接(连接导向)的、可靠的、基于IP的传输层协议。
2、tcp的使用
在网络上的两个程序通过一个双向通信连接进而实现数据交换,这个连接被叫做Socket。Socket通常分为客户端和服务器端。Socket是TCP协议的一个十分流行的编程界面。一个客户端Socket由一个IP地址和一个端口号确定其唯一性。
(1)客户端Socket的常用构造方法。
- Socket()。该方法创建一个Socket对象,该Socket对象不于任何服务器建立联系,要想与服务器建立联系,需要使用该对象提供的
connect(SocketAddress endpoint)
方法,将此对象连接到知道的服务器上。
- Socket(InetAddress address
, int port)
创建一个流套接字并将其连接到指定 IP 地址的指定端口号。
Socket(String host
, int port)
创建Socket并连接到主机ip为host的主机上,同时主机监听port端口
为了简便一般使用
Socket(String host, int port)
,例如Socket socket = new Socket('11.203.2.237',8999),就带表创建一个socket客户端同时此socket连接IP地址为11.203.2.237的主机,同时主机监听端口8999。
(2)socket的常用方法。
getInputStream()。返回此Socket的输入流。
getOutputStream()。返回此Socket的输出流。
在返回的输入/输出流对象上建立过滤流。如DataInputStream、DataOutputStream或者PrintStream类,对于文本方式流对象可以使用InputStreamReader、OutputStreamReader、PrintWriter处理。
例如:
//得到Socket输出流
OutputStream os = s.getOutputStream();
//创建数据传输流
DataOutputStream dos = new DataOutputStream(os);
//将数据从客户端传输到服务器端
dos.writeUTF(str);
dos.flush();
OutputStream os = s.getOutputStream();
//创建数据传输流
DataOutputStream dos = new DataOutputStream(os);
//将数据从客户端传输到服务器端
dos.writeUTF(str);
dos.flush();
(3)关闭socket
s.close().
根据上文完成客户端代码:
public class Client {
public static void main(String[] args) throws Exception {
//获取控制台输入字符串
Scanner scanner = new Scanner(System.in);
String str = scanner.nextLine();
//创建一个流套接字并将其连接到指定 IP 地址的指定端口号
Socket s = new Socket("11.203.2.237", 7597); //ip为你运行服务器端socket代码的地址
//得到Socket输出
OutputStream os = s.getOutputStream();
//创建数据传输流
DataOutputStream dos = new DataOutputStream(os);
//将数据从客户端传输到服务器端
dos.writeUTF(str);
dos.flush();
Thread.sleep(2000);
//获取服务器端返回的输入流数据
DataInputStream dis = new DataInputStream(s.getInputStream());//服务器通过输入管道接收数据流
System.out.println("client sysout --->"+dis.readUTF());
dos.close();
s.close();
}
}
//获取控制台输入字符串
Scanner scanner = new Scanner(System.in);
String str = scanner.nextLine();
//创建一个流套接字并将其连接到指定 IP 地址的指定端口号
Socket s = new Socket("11.203.2.237", 7597); //ip为你运行服务器端socket代码的地址
//得到Socket输出
OutputStream os = s.getOutputStream();
//创建数据传输流
DataOutputStream dos = new DataOutputStream(os);
//将数据从客户端传输到服务器端
dos.writeUTF(str);
dos.flush();
Thread.sleep(2000);
//获取服务器端返回的输入流数据
DataInputStream dis = new DataInputStream(s.getInputStream());//服务器通过输入管道接收数据流
System.out.println("client sysout --->"+dis.readUTF());
dos.close();
s.close();
}
}
对于服务器,一般使用ServerSocket创建服务器端的socket。其常用的构造方法是
new ServerSocket(),创建非绑定服务器套接字,没有与任何端口进行绑定需要使用bind(SocketAddress
endpoint)
将ServerSocket
绑定到特定地址(IP 地址和端口号)上。
new ServerSocket(int port),通过监听该程序所在电脑上对应的端口号,来接收客户端发送的信息。
newServerSocket
(int port, int backlog),利用指定的 backlog 创建服务器套接字并将其绑定到指定的本地端口号。
newServerSocket
(int port, int backlog, InetAddress bindAddr),使用指定的端口、侦听 backlog 和要绑定到的本地 IP 地址创建服务器。
一般我们使用new ServerSocket(int port)方法,同时由于1-1023端口号为系统保留,所以创建端口号时应该让端口号大于1023从而减少冲突。
服务器端代码如下:
public static void main(String[] args) throws Exception {
//创建绑定到特定端口的服务器Socket。
ServerSocket ss = new ServerSocket(7597);//在6666端口监听,准备连接客户端
while (true) {
//取得连接此端口的Socket对象
Socket s = ss.accept();
//获取客户端IP地址
String clientip = s.getInetAddress().getHostAddress();
System.out.println("IP地址为 "+clientip+" 连接了!");
//获取客户端传输过来的输入流
DataInputStream dis = new DataInputStream(s.getInputStream());//服务器通过输入管道接收数据流
String ssss = dis.readUTF();
//将传输过来的输入流再一次返回到客户端
OutputStream os = s.getOutputStream();
DataOutputStream dos = new DataOutputStream(os);//创建数据传输流
dos.writeUTF(ssss);//客户端传输数据
dos.flush();
dos.close();
s.close();
}
}
}