java Socket通信的学习笔记三

本文通过一个具体的Java Socket编程示例,介绍了服务器端如何接收客户端的请求并进行响应,包括正方形面积计算的功能实现,同时展示了客户端如何与服务器进行交互。

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

 先看一段服务器端的代码:

package com.socket.test;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {

	public static void main(String[] args) {
		try {
			System.out.println("开始侦听请求。。。。");
			ServerSocket serverSocket=new ServerSocket(3333);//服务器套接字
			Socket clientSocket=null;
			while(true){
				
				clientSocket=serverSocket.accept();//获得客户端的请求的Socket
				System.out.println("已侦听到了客户端的请求。。。。。");
				new ServerThread(clientSocket);
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}

 下面是ServerThread的代码:

package com.socket.test;

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

public class ServerThread extends Thread {
	
	private Socket socket;
	private InputStream  clientInput;
	private OutputStream clientOutput;
	
	public ServerThread(Socket socket){
			this.socket=socket;
		try {
			this.clientInput=socket.getInputStream();
			this.clientOutput=socket.getOutputStream();
		} catch (IOException e) {
			e.printStackTrace();
		}
		this.start();
	}
	
	@Override
	public void run() {
		System.out.println("this is child class's run method.....");
		BufferedReader breader=new BufferedReader(new InputStreamReader(clientInput));
		try {
			String strLine=breader.readLine();
			if("over".equalsIgnoreCase(strLine)){
				PrintWriter printWriter=new PrintWriter(clientOutput,true);
				printWriter.println("over");
			}else{
				double side=Double.parseDouble(strLine);
				side=Double.parseDouble(strLine);
				System.out.println("Side of Square Received:"+side);
				double squareArea=side*side;
				String str="Side:"+side+"Square:"+squareArea;
				PrintWriter printWriter=new PrintWriter(clientOutput,true);
				printWriter.println(str);
				System.out.println("Finish sending to client...");
				
			}
			clientInput.close();
			clientOutput.close();
			socket.close();
			
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}

}

 这段代码主要作用:

   1从构造函数中获得客户端的套接字请求,创建向客户端输入和输出的流。调用线程执行接下来的请求(this.start());

public ServerThread(Socket socket){
			this.socket=socket;
		try {
			this.clientInput=socket.getInputStream();
			this.clientOutput=socket.getOutputStream();
		} catch (IOException e) {
			e.printStackTrace();
		}
		this.start();
	}
 

   2通过bufferedReader获取客户端的输入并进行分析,假如是over,则向客户端输出over,并关闭,反之。则计算从客户端传来的数值,对应正方形的面积,并蒋结果返回到客户端。之后关闭。

if("over".equalsIgnoreCase(strLine)){
				PrintWriter printWriter=new PrintWriter(clientOutput,true);
				printWriter.println("over");
			}else{
				double side=Double.parseDouble(strLine);
				side=Double.parseDouble(strLine);
				System.out.println("Side of Square Received:"+side);
				double squareArea=side*side;
				String str="Side:"+side+"Square:"+squareArea;
				PrintWriter printWriter=new PrintWriter(clientOutput,true);
				printWriter.println(str);
				System.out.println("Finish sending to client...");
				
			}
 

注意PrintWriter的使用。。。。。。。。。

下面是客户端调用的代码:

package com.socket.test;

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

public class Client {

	public static void main(String[] args) {
		try {
			System.out.println("开始发送请求。。。。");
			Socket socket=new Socket("127.0.0.1",3333);
			BufferedReader bfReader=new BufferedReader(new InputStreamReader(System.in));
			System.out.println("Please input the line.....");
			String strLine=bfReader.readLine();
			
			OutputStream outputStream=socket.getOutputStream();
			InputStream  inputStream=socket.getInputStream();
			
			PrintWriter pw=new PrintWriter(outputStream,true);
			pw.println(strLine);
			BufferedReader br=new BufferedReader(new InputStreamReader(inputStream));
			System.out.println(br.readLine());
			socket.close();
			
		} catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

}

 代码分析:

Socket socket=new Socket("127.0.0.1",3333);
			BufferedReader bfReader=new BufferedReader(new InputStreamReader(System.in));
			System.out.println("Please input the line.....");
			String strLine=bfReader.readLine();

 建立与服务器的连接:

Socket socket=new Socket("127.0.0.1",3333);

构建缓从输入流:

BufferedReader bfReader=new BufferedReader(new InputStreamReader(System.in));
			System.out.println("Please input the line.....");
			String strLine=bfReader.readLine();

获得服务器的输出和输入流:

OutputStream outputStream=socket.getOutputStream();
			InputStream  inputStream=socket.getInputStream();

把输入发送到服务器:

PrintWriter pw=new PrintWriter(outputStream,true);
			pw.println(strLine);

获得服务器的输出:

 

BufferedReader br=new BufferedReader(new InputStreamReader(inputStream));
			System.out.println(br.readLine());

这里的

PrintWriter pw=new PrintWriter(outputStream,true);
			pw.println(strLine);

代码用outputStream我理解的是服务器的输出流对应的就是客户端的输入流,所以客户端发送到服务器端的数据就用outputStream,而获取服务器的输出则用inputStream,感觉这有点怪。不敢肯定是否对?

参考java API:

public class PrintWriter
extends Writer

向文本输出流打印对象的格式化表示形式。此类实现在 PrintStream 中的所有 print 方法。它不包含用于写入原始字节的方法,对于这些字节,程序应该使用未编码的字节流进行写入

构造方法摘要
PrintWriter (File  file)
          使用指定文件创建不具有自动行刷新的新 PrintWriter。
PrintWriter (File  file, String  csn)
          创建具有指定文件和字符集且不带自动刷行新的新 PrintWriter。
PrintWriter (OutputStream  out)
          根据现有的 OutputStream 创建不带自动行刷新的新 PrintWriter。
PrintWriter (OutputStream  out, boolean autoFlush)
          通过现有的 OutputStream 创建新的 PrintWriter。
PrintWriter (String  fileName)
          创建具有指定文件名称且不带自动行刷新的新 PrintWriter。
PrintWriter (String  fileName, String  csn)
          创建具有指定文件名称和字符集且不带自动行刷新的新 PrintWriter。
PrintWriter (Writer  out)
          创建不带自动行刷新的新 PrintWriter。

PrintWriter (Writer  out, boolean autoFlush)
          创建新 PrintWriter。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值