Tcp Socket
实现功能:服务器和客户端间传递消息
服务器端:
//创建ServerSocket(9999) (假设端口号为9999)
//ServerSocket对象通过方法accept()返回一个socket对象
//通过输入流接收消息(设置消息缓冲)
//打印接收到的消息
//关闭输入流
//关闭socket
//关闭serverSocket
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
/**
* Service
*/
public class SocketTCP01Server {
public static void main(String[] args) throws IOException {
//本机9999端口监听,等待连接
//要求本机没有其他服务占用,否则会阻塞
ServerSocket serverSocket = new ServerSocket(9999);
System.out.println("server monitoring in 9999 and waiting for connected...");
//这个ServerSocket 可以通过accept() 返回多个Socket[多个客户端连接服务器的并发]
Socket socket = serverSocket.accept();
System.out.println("socket =" + socket.getClass());
//通过socket.getInputStream() 读取客户端写入数据通道的数据
InputStream inputStream = socket.getInputStream();
//buffer
byte[] buf = new byte[1024];
int readLen = 0;
//所读数据的实际长度
//inputStream.read(buf) 返回一个整形表示字节数
while ((readLen = inputStream.read(buf)) != -1) {
System.out.println(new String(buf, 0 , readLen));
//根据实际读取到的实际长度,显示内容
}
inputStream.close();
socket.close();
serverSocket.close();
//
}
}
客户端:
//创建客户端Socket,并用所要连接的端口号初始化
//创建输出流对象,将要发送至服务器的消息写入输出流
//关闭输出流
//关闭socket
import java.io.IOException;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
/**
* Client
* sent "hello" to Client
*/
public class SockrtTCP01Client {
public static void main(String[] args) throws IOException {
//connect server
//connect the port 9999 of the computer and if connecting successful return socket
Socket socket = new Socket(InetAddress.getLocalHost(), 9999);
System.out.println("Client socket return =" + socket.getClass());
//连接后生成socket,通过socket。个体Output Stream()
//得到和socket对象关联的输出流对象
OutputStream outputStream = socket.getOutputStream();
//3.通过输出流写入数据到数据通道
outputStream.write("hello,server".getBytes());
//关闭流对象和socket
outputStream.close();
socket.close();
System.out.println("Client quit...");
}
}
Tips:
1.一定是server端先运行,进行端口监视
2.客户端与服务端进行通信时,每个消息后最好设置一个结束标记,
写入标记结束标记 socket.shutdownOutput() 或者 writer.newLine(),后者需要使用readLine()读取字符
使用字符流
1.
socket.getOutputStream()
OutputStream -> Writer
使用转换流,OutputStreamWriter
2.
socket.getinputStream()
将InputStream -> Reader
使用转换流InputStreamReader()
客户端
public class SockrtTCP01Client {
public static void main(String[] args) throws IOException {
//connect server
//connect the port 9999 of the computer and if connecting successful return socket
Socket socket = new Socket(InetAddress.getLocalHost(), 9999);
System.out.println("Client socket return =" + socket.getClass());
//连接后生成socket,通过socket。个体Output Stream()
//得到和socket对象关联的输出流对象
OutputStream outputStream = socket.getOutputStream();
//3.通过输出流写入数据到数据通道
//使用字符流
BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream));
bufferedWriter.write("hello,server String ");
bufferedWriter.newLine(); //插入一个换行符表示写入的内容结束,注意,要求对方使用readLine()
bufferedWriter.flush();//使用字符流需要手动刷新,否则数据不会写入数据通道
InputStream inputStream = socket.getInputStream();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
String s = bufferedReader.readLine();
System.out.println(s);
//关闭流对象和socket
bufferedReader.close();
bufferedWriter.close();
socket.close();
System.out.println("Client quit...");
}
}
服务器端
public class SocketTCP01Server {
public static void main(String[] args) throws IOException {
//本机9999端口监听,等待连接
//要求本机没有其他服务占用,否则会阻塞
ServerSocket serverSocket = new ServerSocket(9999);
System.out.println("server monitoring in 9999 and waiting for connected...");
//这个ServerSocket 可以通过accept() 返回多个Socket[多个客户端连接服务器的并发]
Socket socket = serverSocket.accept();
System.out.println("socket =" + socket.getClass());
//通过socket.getInputStream() 读取客户端写入数据通道的数据
InputStream inputStream = socket.getInputStream();
//buffer
OutputStream outputStream = socket.getOutputStream();
//使用字符流读取
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
String s = bufferedReader.readLine();
System.out.println(s);//output
//使用字符输出流的方式回复信息
BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream));
bufferedWriter.write("hello client String");
bufferedWriter.newLine();//结束写入
bufferedWriter.flush();//刷新
bufferedWriter.close();//从后往前关
bufferedReader.close();
socket.close();
serverSocket.close();
//
}
}
Tips:关闭流顺序一般为后打开的先关闭