先来描述一下 TCP的发送数据的步骤,TCP的接收数据步骤
TCP发送数据的步骤:
1.创建客户端的Socket对象(Socket)
2.获取输出流,写数据
3.释放资源
TCP接收数据的步骤:
1.创建服务器端的Socket对象(ServerSocket)
2.获取输入流,读取数据,并把数据显示在数据台
3.释放资源
字节流
字节输出流: OutputStream\n" +
字节输入流: InputStream\n" +
先来一个开胃菜,来熟悉一下用法
一.客户端对服务器进行发送请求,如果服务器做完了,可以给出来相应的回应
package demo26;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
//TCP发送数据的步骤:
// 1.创建客户端的Socket对象(Socket)
// 2.获取输出流,写数据
// 3.释放资源
public class ClientDemo {
public static void main(String[] args) throws UnknownHostException, IOException {
// 里面的127.0.0.1 这里可以填写自己主机的IP地址或主机名称,其他人的也可以,其中返回的是一个字节流。
Socket s = new Socket("127.0.0.1",41231);
//客户端向服务器发送内容
OutputStream os=s.getOutputStream();
//字节
os.write("java ,我来了".getBytes());
//接收服务器的反馈
InputStream is = s.getInputStream();
//创建字节数组进行来接收服务器的回应
byte[] by = new byte[1024];
int len = is.read(by);
String data = new String (by,0,len);
System.out.println("客户端:"+data);
s.close();
}
}
二.服务器的类,接收客户端的内容
package demo26;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream.GetField;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
//TCP接收数据的步骤:
// 1.创建服务器端的Socket对象(ServerSocket)
// 2.获取输入流,读取数据,并把数据显示在数据台
// 3.释放资源
public class ServerDemo {
public static void main(String[] args) throws IOException {
ServerSocket ss=new ServerSocket(41231);
Socket s =ss.accept();
InputStream is = s.getInputStream();
byte[] by = new byte[1024];
int len = is.read(by);
String data= new String(by,0,len);
System.out.println("服务器:"+data);
//对客户端进行回应
OutputStream os=s.getOutputStream();
os.write("数据已经收到:".getBytes());
ss.close();
}
}
2. 进阶的客户端----服务端(结合线程)多客户端与服务端
我们期望的是将TCP.txt中的内容通过客户端发送服务端通过字符写在TCP2.txt中。
里面的内容是
(1)客户端
package demo26;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import demo15.system;
public class ClientDemo3 {
public static void main(String[] args) throws UnknownHostException, IOException {
Socket s = new Socket("192.168.223.1",41231);
BufferedReader br = new BufferedReader(new FileReader("TCP.txt"));
// 封装写字符串数据
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
String line;
while ((line=br.readLine())!=null) {
if (line.equals("886")){
break;
}
else {
bw.write(line);
bw.newLine();
bw.flush();
}
}
//这里注意如果没有这个条件服务端将一直等待客户端的发送数据,而在等待客户端。
// 自定义结束标记
bw.write("886");
bw.newLine();
bw.flush();
// 接收反馈
BufferedReader br2= new BufferedReader(new InputStreamReader(s.getInputStream()));
String data = br2.readLine();
System.out.println("服务器的反馈:"+data);
br.close();
s.close();
}
}
(2)服务器
在服务器里面我们要结合线程,来接收客户端
package demo26;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class ServerDemo3 {
public static void main(String[] args) throws IOException {
ServerSocket ss = new ServerSocket(41231);
while(true) {
Socket s = ss.accept();
new Thread(new ServerThread(s)).start();
}
}
}
创建类
package demo26;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;
public class ServerThread implements Runnable {
private Socket s;
public ServerThread(Socket s) {
this.s=s;
}
@Override
public void run() {
try {
BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
BufferedWriter bw = new BufferedWriter(new FileWriter("TCP2.txt"));
String line;
while ((line = br.readLine()) != null) {
if (line.equals("886")) {
break;
}
System.out.println(line);
bw.write(line);
bw.newLine();
bw.flush();
}
BufferedWriter br2 = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
br2.write("文件上传成功");
br2.newLine();
br2.flush();
bw.close();
s.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
结果