Java中Socket应用
基于TCP协议的Socket通信具体实现:
服务器端:
package Socket;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
/**
* 基于TCP协议的Socket通信,实现用户登录
* 服务器端
*/
package Socket;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
/**
* 基于TCP协议的Socket通信,实现用户登录
* 服务器端
*/
public class Server {
public static void main(String[] args){
try {
//1 创建一个服务器端的Socket,即ServerSocket,指定绑定的端口,并侦听
ServerSocket serverSocket =new ServerSocket(8880);
//2 调用accept()方法开始监听,等待客户端连接
System.out.println("服务器即将启动");
Socket socket =serverSocket.accept();
//3 获取输入流,并读取客户端信息
InputStream is =socket.getInputStream();//字节输入流
InputStreamReader isr = new InputStreamReader(is);//将字节流转换为字符流
BufferedReader br = new BufferedReader(isr);//为输入流添加缓冲
//获取客户端提交的信息
String info = null;
while ((info = br.readLine())!=null){//循环读取客户端信息
System.out.println("我是服务器,客户端说:"+info);
}
socket.shutdownInput();//关闭输入流
//4获取输出流,响应客户端请求
OutputStream os = socket.getOutputStream();
PrintWriter pw =new PrintWriter(os);//包装成打印流
pw.write("故里有长安");
pw.flush();
//5关闭资源
pw.close();
os.close();
br.close();
isr.close();
is.close();
socket.close();
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
客户端:
package Socket;
import java.io.*;
import java.net.Socket;
import java.net.UnknownHostException;
/**
* 客户端
*/
public class Client {
public static void main(String[] args){
try {
//1 创建客户端Socket,指定服务器地址和端口
Socket socket = new Socket("localhost",8880);
//2 获取输出流,用来向服务器端发送信息
OutputStream os =socket.getOutputStream();//字节输出流
PrintWriter pw =new PrintWriter(os);//将输出流包装成打印流
pw.write("长安归故里");
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();
}
}
}
具体实现:
服务器端:
package Socket;
import java.io.*;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
/**
* 基于TCP协议的Socket通信,实现用户登录
* 服务器端
*/
public class Server {
public static void main(String[] args){
try {
//创建一个服务器端的Socket,即ServerSocket,指定绑定的端口,并侦听
ServerSocket serverSocket =new ServerSocket(8880);
Socket socket=null;
//记录客户端的数量
int count = 0;
System.out.println("服务器即将启动");
//循环侦听,等待客户端连接
while (true){
//调用accept()方法开始监听,等待客户端连接
socket =serverSocket.accept();
//创建一个新的线程
ServerThread serverThread =new ServerThread(socket);
//启动线程
serverThread.start();
count++;
System.out.println("客户端的数量:"+count);
InetAddress address = socket.getInetAddress();
System.out.println("当前客户端的ip地址"+address.getHostAddress());
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
服务器线程处理类:
package Socket;
import java.io.*;
import java.net.Socket;
/**
服务器线程处理类
*/
public class ServerThread extends Thread {
//和本线程相关的Socket
Socket socket = null;
//用带参构造方法去初始化和本线程相关的Socket
public ServerThread(Socket socket){
this.socket=socket;
}
//线程执行的操作,响应客户端的请求
public void run(){
try {
//获取输入流,并读取客户端信息
InputStream is = socket.getInputStream();//字节输入流
InputStreamReader isr = new InputStreamReader(is);//将字节流转换为字符流
BufferedReader br = new BufferedReader(isr);//为输入流添加缓冲
//获取客户端提交的信息
String info = null;
while ((info = br.readLine())!=null){//循环读取客户端信息
System.out.println("我是长安,故里说:"+info);
}
socket.shutdownInput();//关闭输入流
//获取输出流,响应客户端请求
OutputStream os = socket.getOutputStream();
PrintWriter pw =new PrintWriter(os);//包装成打印流
pw.write("故里有长安");
pw.flush();
//关闭资源
pw.close();
os.close();
br.close();
isr.close();
is.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
客户端:
package Socket;
import java.io.*;
import java.net.Socket;
import java.net.UnknownHostException;
/**
* 客户端
*/
public class Client {
public static void main(String[] args){
try {
//1 创建客户端Socket,指定服务器地址和端口
Socket socket = new Socket("localhost",8880);
//2 获取输出流,用来向服务器端发送信息
OutputStream os =socket.getOutputStream();//字节输出流
PrintWriter pw =new PrintWriter(os);//将输出流包装成打印流
pw.write("爱小余");
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();
}
}
}