java通过利用TCP,Socket和ServerSocket的类,进行消息的传递,。通过while(true),形成点对点的单次通信。不过必须得等待对方的回复,才可以进行下一步。
之后利用多线程,实现刷屏多次聊天。 利用这一点思路,将输入的字符串转化成文件。来进行文件的传递,以及多用户发送。
package tcom.tcp.test;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
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.util.Scanner;
public class ClientReceiveThread implements Runnable {
private String PATH;
private Socket socket;
public ClientReceiveThread(Socket socket,String PATH){
this.socket = socket;
this.PATH = PATH;
}
public void run() {
System.out.println("请输入要保存文件的地址:");
String PATH1= new Scanner(System.in).next();
File file = new File(PATH1);
try {
InputStream is = socket.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
OutputStream os = new FileOutputStream(file);
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os));
String msg = null;
while((msg=br.readLine())!=null){
bw.write(msg);
bw.newLine();
bw.flush();
}
bw.close();
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
python tcp server
import socket
def main():
# 创建socket套接字
tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 连接服务器 绑定 本地端口
tcp_socket.bind(("", 8888))
# 监听某个端口
tcp_socket.listen(8888)
# 接收数据 返回一个新的客户端socket
client_socket, client_addr = tcp_socket.accept()
recv_data = client_socket.recv(1024)
print(client_addr)
print(recv_data.decode("utf-8"))
# 关闭套接字
tcp_socket.close()
client_socket.close()
pass
if __name__ == '__main__':
main()
循环接收
import socket def main(): # 创建socket套接字 tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 连接服务器 绑定 本地端口 tcp_socket.bind(("", 8888)) # 监听某个端口 tcp_socket.listen(8888) while True: # 接收数据 返回一个新的客户端socket client_socket, client_addr = tcp_socket.accept() recv_data = client_socket.recv(1024) print(client_addr) print(recv_data.decode("utf-8")) client_socket.close() pass # 关闭套接字 tcp_socket.close() if __name__ == '__main__': main()
java tcp client
public static void main(String[] args) {
try {
//1.创建客户端Socket,指定服务器地址和端口
Socket socket = new Socket("127.0.0.1", 8888);
//2.获取输出流,向服务器端发送信息
OutputStream os = socket.getOutputStream();//字节输出流
PrintWriter pw = new PrintWriter(os);//将输出流包装为打印流
pw.write("用户名:whf;密码:789");
pw.flush();
socket.shutdownOutput();//关闭输出流
//3.获取输入流,并读取服务器端的响应信息
InputStream is = socket.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String info = null;
while ((info = br.readLine()) != null) {
System.out.println("我是客户端,服务器说:" + info);
}
//4.关闭资源
br.close();
is.close();
pw.close();
os.close();
socket.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}