java的socket通信

本文详细介绍Java中Socket通信的基本原理及其实现方式,包括服务器端和客户端的编程步骤,并提供了一个支持持续交互的完整示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

所谓socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄。应用程序通常通过"套接字"向网络发出请求或者应答网络请求。经常用于轻量级服务器端和客户端的通信。

 

创建一个Socket对象:
Socket clientPipe = new Socket(localhost,8080);        //连接服务器(需要知道服务器IP+监听端口号)

 

 

实例:

服务器端代码:

import java.net.*; 
import java.io.*; 

public class Server 
{ 
private ServerSocket ss; 
private Socket socket; 
private BufferedReader in; 
private PrintWriter out; 

public Server() { 
try { 
ss = new ServerSocket(10000); 

while (true) { 
socket = ss.accept();      //在有客户端连接前阻塞自己
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));       //输入流
out = new PrintWriter(socket.getOutputStream(),true);        //输出流
String line = in.readLine();          //逐行读取
out.println("you input is :" + line); 
out.close();     //关闭资源
in.close();     //关闭资源
socket.close();     //关闭资源

ss.close();        //关闭资源

catch (IOException e) 
{} 

public static void main(String[] args) { 
new Server(); 

 

客户端代码:

import java.io.*; 
import java.net.*; 

public class Client { 
Socket socket; 
BufferedReader in; 
PrintWriter out; 
public Client() { 
try { 
socket = new Socket("xxx.xxx.xxx.xxx", 10000); 
in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
out = new PrintWriter(socket.getOutputStream(),true); 
BufferedReader line = new BufferedReader(new InputStreamReader(System.in)); 
out.println(line.readLine()); 
line.close(); 
out.close(); 
in.close(); 
socket.close(); 

catch (IOException e) 
{} 

public static void main(String[] args) { 
new Client(); 

 

 

对于需要持续相应客户端请求的服务器端,将相应的逻辑放到while循环中即可:

while(true){
    String reqLine = br.readLine();
    System.out.println("客户请求的消息:"+reqLine+" from["+clientIP+"]");
    if(reqLine.equals("exit")){
     System.out.println("客户端退出了!!! ["+clientIP+"]");
     break;
    }

}

 

 

最后附上可以客户端和持续响应的客户端和服务器端代码(多线程):

客户端:

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;

public class MyClient {
 static PrintWriter pw;
 static String respLine;
 static BufferedReader br ;
 static Socket clientPipe;

 public static void main(String[] args)throws Exception {
  //客户端编程
  String ip = "localhost";
  int port = 1000;
   clientPipe = new Socket(ip,port);//连接服务器(需要知道服务器IP+监听端口号)
  
  System.out.println("客户连接服务器");
  
  while(!respLine.equals("exit")){
  InputStream in =clientPipe.getInputStream();
  OutputStream out = clientPipe.getOutputStream();
  
  //先发送消息,后接收服务器响应消息
   pw = new PrintWriter(out,true);
   String reqLine = null;
  
  System.out.println("请输入您发送给服务器的信息:");
  BufferedReader key = new BufferedReader(new InputStreamReader(System.in));
  respLine = key.readLine();
  System.out.println("reqLine="+respLine);

  pw.println(reqLine);
  
   br = new BufferedReader(new InputStreamReader(in));
  String respLine = br.readLine();
  System.out.println("客户端获得响应消息:"+respLine);
  
  //关闭资源
 }
  pw.close();
  br.close();
  clientPipe.close();
 }
}

 

服务器端(两个类)

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
/**
 * 服务器端程序,启动服务器
 * @author Administrator
 *
 */
public class MyServer {
 
 private ServerSocket server = null;
 
 public MyServer(){
  //服务器端编程
  //IP+port
  try {
   server =new ServerSocket(9999);//构造服务器对象
   System.out.println("服务器启动。。。。");
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } 
 }
 public void startServer(){  
  try {
   while(true){
    //等待客户连接
    Socket clientPipe = server.accept();//阻塞(直到客户连接上来,改方法才会返回值)
    //交给线程来服务器当前客户
    WorkerThread wt = new WorkerThread(clientPipe);
    new Thread(wt).start();
   }
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
 }
}

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;

/**
 * 工作线程,专门服务某个客户
 * @author Administrator
 *
 */
public class WorkerThread implements Runnable{
 private Socket clientPipe;
 
 public WorkerThread(Socket clientPipe){
  this.clientPipe = clientPipe;
 }
 public void run(){
  InetAddress addr = clientPipe.getInetAddress();
  String clientIP = addr.getHostName()+":"+clientPipe.getPort();
  System.out.println("客户链接上来了。。。。"+clientIP);
  
  BufferedReader br = null;
  PrintWriter pw = null;
  
  try {
   //连接上来之后,需要接收/响应客户端消息    
   //先接收消息,后响应消息
   br = new BufferedReader(new InputStreamReader(clientPipe.getInputStream()));
   pw = new PrintWriter(clientPipe.getOutputStream(),true);
   
   //与客户多次交互
   while(true){
    String reqLine = br.readLine();
    System.out.println("客户请求的消息:"+reqLine+" from["+clientIP+"]");
    if(reqLine.equals("exit")){
     System.out.println("客户端退出了!!! ["+clientIP+"]");
     break;
    }
    
    String respLine = new StringBuilder(reqLine).reverse().toString();
    pw.println(respLine);
   }
  } catch (IOException e) {
   e.printStackTrace();
  }finally{
   //不交互,关闭之前打开的资源
   try {
    if(pw!=null){
     pw.close();
    }
    if(br!=null){
     br.close();
    }
    if(clientPipe!=null){
     clientPipe.close();
    }
   } catch (IOException e) {     
    e.printStackTrace();
   }
  }
 }
}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值