1.服务器端启动ServerSocket
2.客户端使用Socket
3.客户端与服务器端使用流通信
4.服务器端启动多线程,accept函数为阻塞接收,将接收到的socket对象开辟新的线程处理
程序结构
对应客户端程序,服务器端程序,线程处理程序
package com.houlu.socket;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.net.UnknownHostException;
public class ClientPart {
public static void main(String[] args){
try {
//1.创建客户端Socket,指定服务器地址和端口号
Socket socket = new Socket("localhost", 8888);
//2.获取输出流
OutputStream os = socket.getOutputStream();//字节输出流
OutputStreamWriter osw = new OutputStreamWriter(os); //字符流
BufferedWriter bw = new BufferedWriter(osw);
bw.write("用户名:admin;密码:123");
bw.flush();
socket.shutdownOutput();
//3.获取输入流,读取服务器端响应
InputStream is = socket.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String receiveStr = null;
while((receiveStr=br.readLine())!=null ){
System.out.println("我是客户端,服务器说:"+receiveStr);
}
//4.关闭输出流,打开的资源
// socket.shutdownInput();
socket.close();
br.close();
isr.close();
is.close();
bw.close();
osw.close();
os.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
package com.houlu.socket;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class ServerPart {
public static void main(String[] args){
try {
//1.创建一个服务器端的SOCKET,绑定相应端口,监听此端口
ServerSocket serverSocket = new ServerSocket(8888);
//2.调用accept()方法开始监听,等待客户端连接
Socket socket = null;
System.out.println("***服务器即将启动,等待客户端连接***");
//3.统计连接客户端数量
int count=0;
while(true){
socket = serverSocket.accept();
ServerThread serverThread = new ServerThread(socket);
serverThread.start();
count++;
System.out.println("客户端数量为"+count);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
package com.houlu.socket;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.InetAddress;
import java.net.Socket;
public class ServerThread extends Thread{
private Socket socket;
public ServerThread(Socket socket) {
super();
this.socket = socket;
}
@Override
public void run() {
InputStream is=null;
InputStreamReader isr =null;
BufferedReader br = null;
String receiveStr = null;
OutputStream os = null;
OutputStreamWriter osw = null;
BufferedWriter bw = null;
try {
InetAddress address = socket.getInetAddress();
System.out.println("当前客户端连接地址"+address.getHostAddress());
//1.获取输入流,读取客户端信息
is = socket.getInputStream();
isr = new InputStreamReader(is);
br = new BufferedReader(isr);
System.out.println("服务器开始接收");
while((receiveStr=br.readLine())!=null ){
System.out.println("我是服务器,客户说:"+receiveStr);
}
System.out.println("服务器接受结束");
// socket.shutdownInput();//关闭输入流
//2.获取输出流,响应客户端请求
os = socket.getOutputStream();
osw = new OutputStreamWriter(os);
bw = new BufferedWriter(osw);
bw.write("欢迎您连接");
bw.flush();
// socket.shutdownOutput();
socket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally{
try {
if(bw!=null)
bw.close();
if(osw!=null)
osw.close();
if(os!=null)
os.close();
if(br!=null)
br.close();
if(isr!=null)
isr.close();
if(is!=null)
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}