版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zoweiccc/article/details/83041094
TCP协议:面向连接(三次握手),数据安全,速度比UDP略低,分为客户端和服务端
客户端先向服务端发起请求,服务端响应请求,传输数据
客户端:创建Socket连接服务端(指定ip地址,端口号)通过ip地址找对应得服务器
调用Socket的getInputStream()和getOutputStream()方法获取和服务端相连的IO流
输入流可以读取服务端输出流写出的数据
输出流可以写出数据到服务端的输入流
服务端:创建ServerSocket(需要指定端口号)
调用ServerSocket的accept()方法接收一个客户端请求,得到一个Socket
调用Socket的getInputStream()和getOutputStream()方法获取和客户端相连的IO流
输入流可以读取客户端输出流写出的数据
输出流可以写出数据到客户端的输入流
客户端代码
package pra_24;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;
public class J_45 {
/**
* @param args
* @throws IOException
* @throws UnknownHostException
*/
public static void main(String[] args) throws Exception {
//客户端
/*
客户端初始版
Socket s1=new Socket("127.0.0.1", 12345);
InputStream is=s1.getInputStream(); //获取客户端输入流
OutputStream os=s1.getOutputStream(); //获取客户端输出流
byte[] arr=new byte[1024];
int len=is.read(arr); //读取服务器发过来的数据
System.out.println(new String(arr,0,len)); //将数据转换成字符串并打印
os.write("qwert".getBytes()); //客户端向服务器写数据
s1.close();
*/
//客户端优化版
Socket s1=new Socket("127.0.0.1", 12345);
BufferedReader br=new BufferedReader(new InputStreamReader(s1.getInputStream()));//将字节流包装成字符流
PrintStream ps=new PrintStream(s1.getOutputStream()); //PrintStream有写出换行的方法
System.out.println(br.readLine());
ps.println("阿拉斯加");
System.out.println(br.readLine());
ps.println("你有完没完!");
s1.close();
}
}
服务器端代码
package pra_24;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
public class J_46 {
public static void main(String[] args) throws Exception{
//服务器
/*
服务器初始版
ServerSocket ss=new ServerSocket(12345);
Socket s=ss.accept(); //接受客户端的请求
InputStream is=s.getInputStream(); //获取客户端输入流
OutputStream os=s.getOutputStream(); //获取客户端输出流
os.write("abcdefghijk".getBytes()); //服务器向客户端写出数据
byte[] arr=new byte[1024];
int len=is.read(arr); //读取客户端发过来的数据
System.out.println(new String(arr,0,len)); //将数据转换成字符串并打印
*/
//服务器优化版
ServerSocket ss=new ServerSocket(12345);
Socket s=ss.accept();
BufferedReader br=new BufferedReader(new InputStreamReader(s.getInputStream()));//将字节流包装成字符流
PrintStream ps=new PrintStream(s.getOutputStream()); //PrintStream有写出换行的方法
ps.println("欢迎光临");
System.out.println(br.readLine());
ps.println("阿拉斯加没用");
System.out.println(br.readLine());
s.close();
}
}
服务端是多线程的方式
package pra_24;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
public class J_46 {
public static void main(String[] args) throws Exception{
//服务器端是多线程的
ServerSocket ss=new ServerSocket(12345);
while(true){
final Socket s=ss.accept();
new Thread(){
public void run(){
try {
BufferedReader br=new BufferedReader(new InputStreamReader(s.getInputStream()));//将字节流包装成字符流
PrintStream ps=new PrintStream(s.getOutputStream()); //PrintStream有写出换行的方法
ps.println("欢迎光临");
System.out.println(br.readLine());
ps.println("阿拉斯加没用");
System.out.println(br.readLine());
s.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}.start();
}
}
}