与UDP不同的是,TCP协议使用的是Socket,而不是DatagramSocket,这是要作区分的。
构造Socket对象的时候,可以直接指定ip地址与端口号。此时需要抛出异常。
import java.net.Socket;
public class TCP_Send {
public static void main(String[] args) throws Exception {
//TCP使用的是Socket
Socket s = new Socket("127.0.0.1",8989);
}
}
当我们运行起来的时候,直接就报出一堆异常了。
这就是TCP协议和我们之前的UDP协议的不同了。
TCP是需要建立连接,才能实现通信。
值得注意的是,在TCP协议中,我们这样规定:(可能有悖于直觉)
发送端:客户端
接收端:服务器端
具体原因我们后面再具体讲解。
在TCP协议中,我们通过“流”来传输数据,“流”的优点是可以传输大量的数据。
而UDP协议所使用的“包”DatagramPacket是有大小限制的。
下面就是我们开发出来的发送端了,也就是客户端:
import java.io.OutputStream;
import java.net.Socket;
public class TCP_Send {
public static void main(String[] args) throws Exception {
//TCP使用的是Socket
Socket s = new Socket("127.0.0.1",8989);
OutputStream ops = s.getOutputStream();
ops.write("你好我是remoo,我使用TCP协议发送一段文字".getBytes());
s.close();
//注,ops 可以不用关闭,Socket会自动帮我们关闭。
}
}
下面我们开发接收端,也就是服务端:
在接收端我们使用ServerSocket。
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class TCP_Receive {
public static void main(String[] args) throws Exception {
ServerSocket ss = new ServerSocket(8989);
Socket clinet = ss.accept();//会暂停,等待连接!
InputStream input = clinet.getInputStream();
byte[] buf = new byte[1024];
int length = input.read(buf);
String s = new String(buf,0,length);
System.out.println(s);
clinet.close();
ss.close();
//输入输出流,Socket会自动帮我们关闭
}
}
如何实现循环发送、接收呢?
服务器-接收端代码:
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class TCP_Receive {
public static void main(String[] args) throws Exception {
ServerSocket ss = new ServerSocket(8989);
Socket clinet = ss.accept();//会暂停,等待连接!
InputStream input = clinet.getInputStream();
byte[] buf = new byte[1024];
while(true){
int length = input.read(buf);
System.out.println(new String(buf,0,length));
}
// clinet.close();
// ss.close();
//输入输出流,Socket会自动帮我们关闭
}
}
客户端
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;
public class TCP_Send {
public static void main(String[] args) throws Exception {
//TCP使用的是Socket
Socket s = new Socket("127.0.0.1",8989);
OutputStream ops = s.getOutputStream();
Scanner sc = new Scanner(System.in);
while (true){
ops.write(sc.next().getBytes());
}
//ops.close();
}
}
效果: