TCP:收到会回复确认,通信两端需要建立连接,属于可靠协议,数据不容易丢失,发送大小无限制,但效率低耗费资源。
一案例演示: TCP编程,客户端向服务器发送数据
//TCP 需要两端建立连接
//TCP 的客户端套接字 Socket
// Socket 此类实现客户端套接字(也可以就叫“套接字”)。套接字是两台机器间通信的端点。
// Socket(InetAddress address, int port)
// 创建一个流套接字并将其连接到指定 IP 地址的指定端口号。
//
// Socket(String host, int port)
// 创建一个流套接字并将其连接到指定主机上的指定端口号。
//参数1 服务器的IP 服务器的端口
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
public class TCPclient {
public static void main(String[] args) throws IOException {
Socket socket= new Socket("192.168.8.73",9999) ;//创建客户端套接字
OutputStream out = socket.getOutputStream();//获取通道内的流,使用流来获取通道内的数据
out.write("这是客户端发给服务器的数据".getBytes());
socket.close();
}
}
-----------------------------------------------------------------------------------------
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class TCPserver {
public static void main(String[] args) throws IOException {
//TCP 服务端的套接字 ServerSocket 此类实现服务器套接字。服务器套接字等待请求通过网络传入。
//ServerSocket( int port)
//创建绑定到特定端口的服务器套接字。
ServerSocket ss = new ServerSocket(9999);
System.out.println("服务器端已开启");
//监听客户端,此方法在客户端数据传入之前一直处于阻塞状态,accept()侦听并接收此套接字的连接
Socket accept = ss.accept();
//获取通道内的输入流
InputStream in = accept.getInputStream();
byte[] bytes = new byte[1024];
int len = in.read(bytes);
System.out.println(new String(bytes,0,len));
ss.close();
}
}
二案例演示: TCP编程,客户端从键盘向服务器发送数据,
public class TCPClient {
public static void main(String[] args) throws IOException {
//客户端键盘录入,服务端输出
Socket socket = new Socket("192.168.8.73", 9999);
//获取通道中的输出流
OutputStream out = socket.getOutputStream();
//键盘录入
BufferedReader bfr = new BufferedReader(new InputStreamReader(System.in));
//包装通道中的字节输出流
BufferedWriter bfw = new BufferedWriter(new OutputStreamWriter(out));
while (true) {
System.out.println("请输入字符串");
String s = bfr.readLine();
bfw.write(s);
bfw.newLine();
bfw.flush();
}
}
}
-----------------------------------------------------------------------------------------
public class TCPServer {
public static void main(String[] args) throws IOException {
ServerSocket ss = new ServerSocket(9999);
System.out.println("服务器已经开启....");
Socket socket = ss.accept();
InputStream in = socket.getInputStream();
//包装通道中的输入流
BufferedReader bfr = new BufferedReader(new InputStreamReader(in));
while (true) {
String s = bfr.readLine();
System.out.println(s);
}
}
}
三案例演示: TCP编程,客户端向服务器发送数据,服务器给予反馈
public class TCPClient {
public static void main(String[] args) throws IOException {
//客户端给服务器发送一个消息后,服务端给客户端一个反馈
Socket socket = new Socket("192.168.8.73", 9999);
//获取通道中的输出流
OutputStream out = socket.getOutputStream();
out.write("你好服务器".getBytes());
//读取服务器的反馈
InputStream in = socket.getInputStream();
byte[] bytes = new byte[1024];
int len = in.read(bytes);
System.out.println(new String(bytes, 0, len));
//关闭客户端
socket.close();
}
}
-----------------------------------------------------------------------------------------
public class TCPServer {
public static void main(String[] args) throws IOException {
ServerSocket ss = new ServerSocket(9999);
System.out.println("服务器已经开启....");
Socket socket = ss.accept();
//读取客户端发来的消息
InputStream in = socket.getInputStream();
byte[] bytes = new byte[1024];
int len = in.read(bytes);
System.out.println(new String(bytes, 0, len));
//给反馈端一个反馈
OutputStream out = socket.getOutputStream();
out.write("你好客户端消息已经收到,放心".getBytes());
ss.close();
}
}
四案例演示: TCP编程,客户端从键盘录入向服务器发送数据,服务器接收到数据后给客户端一个反馈
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;
public class TCPclient {
public static void main(String[] args) throws IOException {
Socket socket = new Socket("192.168.8.73", 9999);
OutputStream out = socket.getOutputStream();
Scanner sc=new Scanner(System.in);
System.out.println("请键盘输入要发给服务器的内容");
while (sc.hasNextLine()){
String s = sc.nextLine();
byte[] bytes = s.getBytes();
out.write(bytes,0,bytes.length);
if("886".equals(s)){
break;
}
//读取服务器反馈回的数据
InputStream in = socket.getInputStream();
byte[] bytes1 = new byte[1024];
int len = in.read(bytes1);
System.out.println(new String(bytes1,0,len));
}
socket.close();
}
}
----------------------------------------------------------------------------------------
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class TCPserver {
public static void main(String[] args) throws IOException {
ServerSocket ss = new ServerSocket(9999);
System.out.println("服务器已开启");
Socket accept = ss.accept();
while(true){
InputStream in = accept.getInputStream();
byte[] bytes = new byte[1024];
int len = in.read(bytes);
String s = new String(bytes, 0, len);
System.out.println(s);
if("886".equals(s)){
break;
}
OutputStream out = accept.getOutputStream();
out.write("我服务器已收到你发来的数据".getBytes());
}
}
}
四案例演示: TCP编程,客户端从键盘录入向服务器发送数据,服务器接收到数据后写入文本文件中
import java.io.*;
import java.net.Socket;
public class TCPClient{
public static void main(String[] args) throws IOException{
//客户端键盘录入,服务端输出
Socket socket = new Socket("192.168.8.73", 9999);
//获取通道中的输出流
OutputStream out = socket.getOutputStream();
//键盘录入
BufferedReader bfr = new BufferedReader(new InputStreamReader(System.in));
//包装通道中的字节输出流
BufferedWriter bfw = new BufferedWriter(new OutputStreamWriter(out));
while (true) {
System.out.println("请输入字符串");
String s = bfr.readLine();
bfw.write(s);
bfw.newLine();
bfw.flush();
if ("886".equals(s)) {
break;
}
}
}
}
----------------------------------------------------------------------------------------
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class TCPServer {
public static void main(String[] args) throws IOException {
ServerSocket ss = new ServerSocket(9999);
System.out.println("服务器已经开启....");
Socket socket = ss.accept();
InputStream in = socket.getInputStream();
//包装通道中的输入流
BufferedReader bfr = new BufferedReader(new InputStreamReader(in));
//创建一个输出流,关联文本文件
BufferedWriter writer = new BufferedWriter(new FileWriter("msg.txt"));
while (true) {
String s = bfr.readLine();
if("886".equals(s)){
break;
}
writer.write(s);
writer.newLine();
writer.flush();
}
writer.close();
}
}
四案例演示: TCP编程,客户端读取文本文件的内容,发给服务器,让服务器输出
public class TCPServer {
public static void main(String[] args) throws IOException {
//服务器输出客户端发来的消息
ServerSocket ss = new ServerSocket(9999);
System.out.println("服务器已经开启....");
Socket socket = ss.accept();
InputStream in = socket.getInputStream();
//包装通道中的输入流
BufferedReader bfr = new BufferedReader(new InputStreamReader(in));
String str=null;
while ((str=bfr.readLine())!=null){
System.out.println(str);
}
}
}
-----------------------------------------------------------------------------------
public class TCPClient {
public static void main(String[] args) throws IOException {
//客户端读取文本文件中的内容,发给服务器,让服务器输出
//客户端键盘录入,服务端输出
Socket socket = new Socket("192.168.8.73", 9999);
//获取通道中的输出流
OutputStream out = socket.getOutputStream();
//包装通道中的输出流
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(out));
//创建一个输入流,来关联这个文本文件
BufferedReader reader = new BufferedReader(new FileReader("msg.txt"));
//边读取边给服务器写出去
String line = null;
while ((line = reader.readLine()) != null) {
writer.write(line);
writer.newLine();
writer.flush();
}
reader.close();
socket.close();
}
}
五案例演示: TCP编程,文件上传并保存
//客户端从文本文件中读取消息,发给服务端,服务端,把客户端发来的消息,保存到文本文件中,就实现了文本文件的上传
public class TCPClient {
public static void main(String[] args) throws IOException{
Socket socket = new Socket("192.168.8.73", 9999);
//获取通道中的输出流
OutputStream out = socket.getOutputStream();
//包装通道中的输出流
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(out));
//创建一个输入流,来关联这个文本文件
BufferedReader reader = new BufferedReader(new FileReader("msg.txt"));
String line = null;
while ((line = reader.readLine()) != null) {
writer.write(line);
writer.newLine();
writer.flush();
}
reader.close();
socket.close();
}
}
-----------------------------------------------------------------------------------------
public class TCPServer {
public static void main(String[] args) throws IOException {
ServerSocket ss = new ServerSocket(9999);
System.out.println("服务器已经开启....");
Socket socket = ss.accept();
InputStream in = socket.getInputStream();
//把通道中的输入流包装成字符流
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
//关联一个输出流
BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter("msg1.txt"));
String line=null;
while ((line=reader.readLine())!=null){
bufferedWriter.write(line);
bufferedWriter.newLine();
bufferedWriter.flush();
}
//释放资源
bufferedWriter.close();
ss.close();
}
}
六案例演示: TCP编程,文件上传并保存,在五的基础上再从服务器给客户端一个反馈
public class TCPClient {
public static void main(String[] args) throws IOException{
Socket socket = new Socket("192.168.8.73", 9999);
//获取通道中的输出流
OutputStream out = socket.getOutputStream();
//包装通道中的输出流
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(out));
//创建一个输入流,来关联这个文本文件
BufferedReader reader = new BufferedReader(new FileReader("msg.txt"));
String line = null;
while ((line = reader.readLine()) != null) {
writer.write(line);
writer.newLine();
writer.flush();
}
//我就手写一个标记,发给服务端,我传完了
writer.write("over");
writer.newLine();
writer.flush();
//我要读取服务端的反馈
InputStream inputStream = socket.getInputStream();
byte[] bytes = new byte[1024];
int len = inputStream.read(bytes);
System.out.println(new String(bytes, 0, len));
reader.close();
socket.close();
}
}
-----------------------------------------------------------------------------------------
public class TCPServer {
public static void main(String[] args) throws IOException {
ServerSocket ss = new ServerSocket(9999);
System.out.println("服务器已经开启....");
Socket socket = ss.accept();
InputStream in = socket.getInputStream();
//把通道中的输入流包装成字符流
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
//关联一个输出流
BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter("msg1.txt"));
String line=null;
while ((line=reader.readLine())!=null){
bufferedWriter.write(line);
bufferedWriter.newLine();
bufferedWriter.flush();
}
//释放资源
bufferedWriter.close();
ss.close();
}
}
六案例演示: TCP编程,文件上传并保存,六的基础上用socket.shotdownOutput()//文件穿完则关闭输出通道
public class TCPClient {
public static void main(String[] args) throws IOException{
Socket socket = new Socket("192.168.8.73", 9999);
//获取通道中的输出流
OutputStream out = socket.getOutputStream();
//包装通道中的输出流
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(out));
//创建一个输入流,来关联这个文本文件
BufferedReader reader = new BufferedReader(new FileReader("msg.txt"));
String line = null;
while ((line = reader.readLine()) != null) {
writer.write(line);
writer.newLine();
writer.flush();
}
//客户端,已经传完了
socket.shutdownOutput();//关闭输出通道,服务端那边就不会阻塞了
//我要读取服务端的反馈
InputStream inputStream = socket.getInputStream();
byte[] bytes = new byte[1024];
int len = inputStream.read(bytes);
System.out.println(new String(bytes, 0, len));
reader.close();
socket.close();
}
}
-----------------------------------------------------------------------------------------
public class TCPServer {
public static void main(String[] args) throws IOException {
//服务端上传文件完成了之后,给客户端一个反馈
ServerSocket ss = new ServerSocket(9999);
System.out.println("服务器已经开启....");
Socket socket = ss.accept();
InputStream in = socket.getInputStream();
//把通道中的输入流包装成字符流
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
//关联一个输出流
BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter("msg1.txt"));
String line=null;
while ((line=reader.readLine())!=null){
bufferedWriter.write(line);
bufferedWriter.newLine();
bufferedWriter.flush();
}
System.out.println("=====================");
//保存完毕后,给客户端一个反馈
OutputStream outputStream = socket.getOutputStream();
outputStream.write("文件上传成功".getBytes());
//释放资源
bufferedWriter.close();
ss.close();
}
}
七案例演示: TCP编程多个客户端连接服务器-开线程
public class TCPClient {
public static void main(String[] args) throws IOException{
Socket socket = new Socket("192.168.8.73", 9999);
//获取通道中的输出流
OutputStream out = socket.getOutputStream();
//包装通道中的输出流
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(out));
//创建一个输入流,来关联这个文本文件
BufferedReader reader = new BufferedReader(new FileReader("msg.txt"));
String line = null;
while ((line = reader.readLine()) != null) {
writer.write(line);
writer.newLine();
writer.flush();
}
//客户端,已经传完了
socket.shutdownOutput();//关闭输出通道,服务端那边就不会阻塞了
//我要读取服务端的反馈
InputStream inputStream = socket.getInputStream();
byte[] bytes = new byte[1024];
int len = inputStream.read(bytes);
System.out.println(new String(bytes, 0, len));
reader.close();
socket.close();
}
}
---------------------------------------------------------------------------------------
public class TCPServer {
public static void main(String[] args) throws IOException {
//服务端上传文件完成了之后,给客户端一个反馈
ServerSocket ss = new ServerSocket(9999);
System.out.println("服务器已经开启....");
int i=1;
while (true){
Socket socket = ss.accept();
System.out.println((i++)+"个客户端已经连接");
new ServerThread(socket).start();
}
}
}
--------------------------------------------------------------------------------------
public class ServerThread extends Thread {
Socket socket;
public ServerThread(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
try {
InputStream in = socket.getInputStream();
//把通道中的输入流包装成字符流
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
//关联一个输出流
BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(System.currentTimeMillis()+"msg1.txt"));
String line = null;
while ((line = reader.readLine()) != null) {
bufferedWriter.write(line);
bufferedWriter.newLine();
bufferedWriter.flush();
}
System.out.println("=====================");
//保存完毕后,给客户端一个反馈
OutputStream outputStream = socket.getOutputStream();
outputStream.write("文件上传成功".getBytes());
//释放资源
bufferedWriter.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
-----------------------------------------------------------------------------------------