一、基本原理
二、实际运行
服务器代码:
public static void main(String[] args) {
try {
//1、创建ServerSocket,绑定端口
ServerSocket serverSocket=new ServerSocket(8888);
System.out.println("服务器已经启动,等待连接。。。。");
//2、等待客户机的连接
Socket socket=serverSocket.accept();
//3、创建输入流,接收客户端传来的消息
InputStream inputStream=socket.getInputStream();
BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(inputStream));
String inString=null;
while((inString=bufferedReader.readLine())!=null){//循环读取
System.out.println("客户端说:"+inString);
}
socket.shutdownInput();
//4、创建输出流,给客户端返回响应的消息
OutputStream outputStream=socket.getOutputStream();
PrintWriter printWriter=new PrintWriter(outputStream);
printWriter.write("欢迎您!");
printWriter.flush();
socket.shutdownOutput();
//5、依次关闭
printWriter.close();
outputStream.close();
bufferedReader.close();
inputStream.close();
socket.close();
serverSocket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
客户端代码:
public static void main(String[] args) {
try {
//1、创建客户端Socket,并且绑定IP地址和端口号
Socket socket=new Socket("localhost",8888);
//2、创建输出流,向服务器发送消息
OutputStream outputStream=socket.getOutputStream();//字节输出流
PrintWriter printWriter=new PrintWriter(outputStream);//变成打印流
printWriter.write("用户名:Simon_Deng,密码:123456");
System.out.println("已经信息发送给服务器!");
printWriter.flush(); //很重要,一定要写,否则消息发布出去
socket.shutdownOutput(); //关闭输出流
//3、接收服务器返回的消息
InputStream inputStream=socket.getInputStream();
BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(inputStream));
String infoString=null;
while((infoString=bufferedReader.readLine())!=null){//循环读取
System.out.println("接收到服务器信息:"+infoString);
}
//4、依次关闭
socket.shutdownInput();
bufferedReader.close();
inputStream.close();
printWriter.close();
outputStream.close();
socket.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
三、多线程通话
要实现多线程,只需改服务器即可,客户端代码不变
要新建ServerThread类继承Thread类
ServerThread代码:
public class ServerThread extends Thread{
Socket socket=null;
InputStream inputStream=null;
OutputStream outputStream=null;
BufferedReader bufferedReader=null;
String info=null;
PrintWriter printWriter=null;
public ServerThread(Socket socket){
this.socket=socket;
}
public void run(){
try {
inputStream=socket.getInputStream();
bufferedReader=new BufferedReader(new InputStreamReader(inputStream));
while((info=bufferedReader.readLine())!=null){
System.out.println("我是服务器,客户端说:"+info);
}
outputStream=socket.getOutputStream();
printWriter=new PrintWriter(outputStream);
printWriter.write("欢迎你!");
printWriter.flush();
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
if(printWriter!=null)
printWriter.close();
if(outputStream!=null)
outputStream.close();
if(bufferedReader!=null)
bufferedReader.close();
if(inputStream!=null)
inputStream.close();
if(socket!=null)
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
服务器代码:
public static void main(String[] args) {
try {
int count=0;
ServerSocket serverSocket=new ServerSocket(8888);
Socket socket=null;
System.out.println("服务器正在等待连接.....");
while(true){
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) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}