TCP协议分为客户端和服务端
- 客户端
- 创建Socket连接服务端(指定ip地址,端口号)通过ip地址找对应的服务器
- 调用Socket的getInputStream()和getOutputStream()方法获取和服务端相连的IO流
- 输入流可以读取服务端输出流写出的数据
- 输出流可以写出数据到服务端的输入流
- 2.服务端
import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.ServerSocket; import java.net.Socket;
/* 服务端
- 创建ServerSocket(需要指定端口号)
- 调用ServerSocket的accept()方法接收一个客户端请求,得到一个Socket
- 调用Socket的getInputStream()和getOutputStream()方法获取和客户端相连的IO流
- 输入流可以读取客户端输出流写出的数据
- 输出流可以写出数据到客户端的输入流 */ public class Demo01Server {
public static void main(String[] args) throws IOException {ServerSocket server = new ServerSocket(8888);Socket socket = server.accept(); //接受客户端的请求InputStream is = socket.getInputStream(); //获取客户端输入流OutputStream os = socket.getOutputStream(); //获取客户端的输出流os.write("百度一下你就知道".getBytes()); //服务器向客户端写出数据byte[] arr = new byte[1024];int len = is.read(arr); //读取客户端发过来的数据System.out.println(new String(arr,0,len)); //将数据转换成字符串并打印socket.close();}
}
```java
package cn.giteasy.tcp;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
/**
* 客户端
* 创建Socket连接服务端(指定ip地址,端口号)通过ip地址找对应的服务器
* 调用Socket的getInputStream()和getOutputStream()方法获取和服务端相连的IO流
* 输入流可以读取服务端输出流写出的数据
* 输出流可以写出数据到服务端的输入流
*/
public class Demo01Client {
public static void main(String[] args) throws UnknownHostException, IOException {
Socket socket = new Socket("localhost", 8888);
InputStream is = socket.getInputStream(); //获取客户端输入流
OutputStream os = socket.getOutputStream(); //获取客户端的输出流
byte[] arr = new byte[1024];
int len = is.read(arr); //读取服务器发过来的数据
System.out.println(new String(arr,0,len)); //将数据转换成字符串并打印
os.write("hello world!".getBytes()); //客户端向服务器写数据
socket.close();
}
}
TCP协议直接发送和接收字符串
package cn.giteasy.tcp;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
/**
* 服务端
* 每次可以读取一行
* 每次可以直接写出字符串
*/
public class Demo02Server {
public static void main(String[] args) throws IOException {
ServerSocket server = new ServerSocket(8888);
//接受客户端的请求
Socket socket = server.accept();
//将字节流包装成了字符流
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
//PrintStream中有写出换行的方法
PrintStream ps = new PrintStream(socket.getOutputStream());
ps.println("你要听什么歌曲?");
//readLine是以\r\n为结束标记,如果读不到\r\n会一直读,卡在这里
System.out.println(br.readLine());
ps.println("谁唱的?");
System.out.println(br.readLine());
socket.close();
}
}
package cn.giteasy.tcp;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;
import java.net.UnknownHostException;
/**
* 客户端
*
* 将字节流包装成了字符流
* 每次可以读取一行数据,并且可以直接写出字符串
*
*/
public class Demo02Client {
public static void main(String[] args) throws UnknownHostException, IOException {
Socket socket = new Socket("localhost", 8888);
//将字节流包装成了字符流
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
//PrintStream中有写出换行的方法
PrintStream ps = new PrintStream(socket.getOutputStream());
System.out.println(br.readLine());
//写出时,println()自带\r\n
ps.println("青花瓷");
System.out.println(br.readLine());
ps.println("周杰伦");
socket.close();
}
}
多线程服务端
package cn.giteasy.tcp;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
/**
* 服务端
* 多线程服务端
*/
public class Demo02ServerThread {
public static void main(String[] args) throws IOException {
ServerSocket server = new ServerSocket(8888);
while(true) {
final Socket socket = server.accept();
//可使用线程池
new Thread() {
@Override
public void run() {
try {
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintStream ps = new PrintStream(socket.getOutputStream());
ps.println("你要听什么歌曲?");
System.out.println(br.readLine());
ps.println("谁唱的?");
System.out.println(br.readLine());
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}.start();
}
}
}
