使用TCP进行数据传输
传输思路:TCP传输分为客户端和服务端,其中客户端对应的对象为Socket,服务端对应的对象为ServerSocket
客户端
import java.io.*;
import java.net.*;
public class TCPUser {
public static void main(String [] args) throws Exception{
//创建Socket服务,并指定要连接的主机和端口
Socket s=new Socket("本机IP",10003);
//向服务端发送数据,应该获取Socket流中的输出流
OutputStream out = s.getOutputStream();
out.write("Hello,ni hao!".getBytes());
out.close();
}
}
服务端
import java.io.*;
import java.net.*;
public class TCPserver {
public static void main(String [] args) throws Exception{
ServerSocket ss=new ServerSocket(10003);
//获取连接过来的客户端对象,通过ServerSocket的accept()方法,是一个阻塞式方法
Socket s_1=ss.accept();
//客户端如果发过来数据,那么服务端要使用对应的客户端对象,并获取到该客户端
//的对象的读取发过来的数据并打印在控制台
byte [] buf=new byte[1024];
InputStream in=s_1.getInputStream();
int len=in.read(buf);
InetAddress ad=s_1.getInetAddress();
System.out.println(ad.getHostAddress()+"::"+new String(buf,0,len));
s_1.close();
ss.close();
}
}
注意:Socket的构造方法的描述:创建一个流套接字并将其连接到指定 IP 地址的指定端口号。 也就是说该端口就是服务端的端口
小练习以及改进
客户端向服务端发送一条字符串,服务端返回该字符串的大写格式
public class TCPlianxiUser {
public static void main(String[] args) throws Exception {
Socket s = new Socket("本机IP", 10004);
OutputStream outofu = s.getOutputStream();
InputStream inofu = s.getInputStream();
BufferedReader buf = new BufferedReader(new InputStreamReader(System.in, "GBK"));
while (true) {
String str = buf.readLine();
if ("over".equals(str)) {
outofu.write(null);
outofu.close();
inofu.close();
break;
}
outofu.write(str.getBytes("GBK"));
byte[] bufofin = new byte[1024];
int len = inofu.read(bufofin);
System.out.println(new String(bufofin, 0, len, "GBK"));
}
s.close();
}
}
public class TCPlianxiServer {
public static void main(String[] args) throws Exception {
ServerSocket ss = new ServerSocket(10004);
Socket user = ss.accept();
InputStream inofser = user.getInputStream();
OutputStream outofser = user.getOutputStream();
byte[] bufofser = new byte[1024];
while (true) {
int len = inofser.read(bufofser);
String newstr = new String(bufofser, 0, len,"GBK");
InetAddress ip=user.getInetAddress();
System.out.println(ip.getHostAddress()+"::"+newstr);
newstr = newstr.toUpperCase();
outofser.write(newstr.getBytes("GBK"));
}
}
}
可以看到使用字节流比较麻烦
改进(使用打印流)
import java.io.*;
import java.net.*;
public class TCPlianUserPlus {
public static void main(String [] args) throws Exception{
Socket s=new Socket("本机IP",10004);
PrintStream pofu=new PrintStream(s.getOutputStream(),true,"GBK");
BufferedReader inofu=new BufferedReader(new InputStreamReader(s.getInputStream(),"GBK"));
BufferedReader inofkey=new BufferedReader(new InputStreamReader(System.in,"GBK"));
while(true){
String str=inofkey.readLine();
if("exit".equals(str)){
pofu.println("exit");
break;
}
pofu.println(str);
String strofser = inofu.readLine();
System.out.println(strofser);
}
s.close();
}
}
import java.io.*;
import java.net.*;
public class TCPlianServerplus {
public static void main(String [] args) throws Exception{
ServerSocket ss=new ServerSocket(10004);
Socket user=ss.accept();
BufferedReader inofser=new BufferedReader(new InputStreamReader(user.getInputStream(),"GBK"));
PrintStream pofser=new PrintStream(user.getOutputStream(),true,"GBK");
while(true){
String str=inofser.readLine();
if("exit".equals(str))
break;
pofser.println(str.toUpperCase());
}
}
}
采用打印流之后明显简化了很多