`

Socket 学习笔记(三)补充关于Socket双向输入输出的例子

 
阅读更多
前面几章的例子中服务端收到信息后都没有返回应答信息,在实际中也许会有用到,写个例子记住

服务端代码

package com.mytest.socket;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class SocketSevice {

	//侦听端口
	private  int port;
	
	private  ServerSocket serverSocket;
	
	//最大连接
	private static  int maxCount=3;
	
	//连接数量累计
	private  int index=0;
	
	private static  SocketSevice socketSevice=new SocketSevice(); 
	
	//任务线程池
	private  ExecutorService threadPool=Executors.newFixedThreadPool(maxCount);
	
	private SocketSevice(){}
	
	public static SocketSevice getInstance() 
	{
	
		return socketSevice;
	}
	
	public void listening(int port) throws IOException
	{
		this.port=port;
		serverSocket=new ServerSocket(port);
		
		//使用accept()阻塞等待客户请求,有客户请求到来则产生一个Socket对象,并继续执行
		while(true){	
		    Socket socket=serverSocket.accept();
		     SocketTask task=new SocketTask(socket,"任务"+index);
			 threadPool.execute(task);
			 index++;
		    
		   
		}
		
		
	}
	
	public void shutdown() throws IOException
	{
		if(threadPool.isTerminated()){
		  threadPool.shutdown();
		  serverSocket.close();
		}
	}
	
	public static void main(String[] args) 
	{
		SocketSevice s=SocketSevice.getInstance();
		
		try {
			s.listening(1099);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		
	}
	
	
	public int getPort() {
		return port;
	}

	public void setPort(int port) {
		this.port = port;
	}
	
	
	
}





package com.mytest.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;

public class SocketTask implements Runnable{

	private Socket socket;
	private String name;
	
	public SocketTask(Socket socket,String name)
	{
		this.socket=socket;
		this.name=name;
		System.out.println("["+name+"]"+"开始.....");
	}
	
	@Override
	public void run() {
		
		BufferedReader br =null;
		BufferedWriter bw=null;
	try {
		
		 br=new BufferedReader(new InputStreamReader(socket.getInputStream()));  
         String  msg= br.readLine();  
         bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));  
         System.out.println("["+name+"]"+"接收数据>>"+msg);
         String str = "当前处理["+msg+"]";  
         bw.write(str);  
         bw.flush();  
         System.out.println("推送["+name+"]应答信息\n");
	} catch (IOException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}finally
	{
		try {
			if(br!=null)
			{
				br.close();
			}
			if(bw!=null)
			{
				bw.close();
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
			
	}
		
	
		
		
	}

}



客户端的具体代码


package com.mytest.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.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;

public class SocketClient {
	
	private int remotePort;
	private String remoteIp;
	private Socket socket;
	
	public SocketClient(String remoteIp,int remotePort) throws IOException
	{
		this.remoteIp=remoteIp;
		this.remotePort=remotePort;
		socket=new Socket(remoteIp,remotePort);
		System.out.println("连接 : "+remoteIp+" : "+remotePort);
		
	}
	
	
	
    public void close() throws IOException
    {
    	socket.close();
    	System.out.println(" ----关闭连接 ----\n");
    }
	
	public void writeString(String str) throws IOException
	{
		//构建IO流  
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));  
		
		bw.write(str);
		
		//当接收的类使用的是BufferedReader,发送的类是BufferedWriter的时候,要注意发送的一行要有换行标识符才能正确写入
		
		bw.newLine();
		//刷新缓冲区才能真正写入
		bw.flush();
		System.out.println("传送数据: "+str);

        //读取服务器返回的消息数据  
		
		BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));  
	    String callbrk=br.readLine();
        System.out.println(socket.getInetAddress().getLocalHost()+":"+socket.getPort()+">>"+callbrk); 
        
		
		 
		 
	}
	
	

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		try {
			for(int i=0;i<5;i++){
			SocketClient client=new SocketClient("127.0.0.1",1099);
			client.writeString("哈哈哈"+i);
			
			client.close();
			
			}
			
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
   
	}

}



先运行服务端(SocketSevice),再运行客户端(SocketClient) 效果如下







  • 大小: 22.9 KB
  • 大小: 12.2 KB
分享到:
评论

相关推荐

    Socket输入输出服务器程序

    总的来说,Socket输入输出服务器程序涉及到网络编程的基本概念,包括服务器的监听与接受连接,客户端的连接请求,以及基于Socket的双向数据传输。通过深入理解和实践这样的程序,开发者可以构建更复杂的网络应用,如...

    Socket网络编程学习笔记

    这份"Socket网络编程学习笔记"涵盖了从基础概念到高级技术的全面知识,对于初学者来说是一份非常有价值的参考资料。以下是对这份笔记内容的详细解读: 1. **Socket基本概念**:Socket在计算机网络中扮演着桥梁的...

    socket 学习笔记

    以下是对Socket学习笔记的详细解释: 1. **Socket构造方法**: - `Socket()`:创建一个未连接的Socket对象。 - `Socket(InetAddress address, int port)`:创建一个Socket并连接到指定的IP地址和端口。 - `...

    Socket编程例子

    Socket编程是计算机网络通信中的重要概念,主要用于实现进程间的网络通信。在本示例中,我们探讨的是如何使用...通过"TestSocket"这个例子,你可以更深入地学习如何在实际项目中运用Socket,从而实现跨网络的高效通信。

    Socket网络编程学习笔记.zip

    本学习笔记将带你深入理解这一领域,特别是通过Socket接口进行的网络通信。Socket是操作系统提供的一种通信机制,它允许应用程序创建并管理网络连接,进行数据传输。 **TCP/IP协议族** TCP/IP(Transmission ...

    Socket编程简单例子

    注意,关闭Socket会关闭其对应的输入输出流,所以不必单独关闭。 在实际的Android应用中,为了提高用户体验,我们可能会在不同的线程中处理Socket连接和数据传输,避免阻塞UI线程。这通常通过创建一个`AsyncTask`...

    c# socket 双向通信

    在IT行业中,网络通信是软件开发的一个重要领域,特别是在分布式系统和互联网应用中...在提供的压缩包文件中,可能包含了实现这些功能的示例代码,通过学习和分析这些代码,开发者可以加深对C# Socket双向通信的理解。

    socket网络笔记总结(适合新手)

    适合新手学习的网络socket编程笔记,内容详细简单明了。

    socketdemo 一个用来学习socket入门的例子

    - 通过`Socket`对象的`getInputStream()`和`getOutputStream()`方法获取输入输出流。 - 在输入输出流上读写数据。 - 关闭资源。 - 客户端的步骤: - 创建`Socket`对象,指定服务器的IP和端口。 - 获取`Socket...

    C# SOCKET 通讯例子

    在IT行业中,网络通信是软件开发的一个重要领域,特别是在分布式系统和实时数据交换的应用中。...在这个例子中,我们看到了如何使用C#实现基本的Socket通信,这对于学习网络编程和理解网络通信机制是非常有价值的。

    android socket通讯例子

    客户端(Socket_Client)则需要连接到服务器,建立Socket连接,并通过输入输出流进行数据交互: ```java Socket socket = new Socket("localhost", 8888); OutputStream outputStream = socket.getOutputStream(); ...

    Socket学习笔记

    本资源包含了Socket学习笔记和课件,适合对网络编程感兴趣的初学者或希望深入理解Socket技术的学习者。 首先,我们需要了解Socket的基本概念。Socket是操作系统提供的一个接口,它允许应用程序通过这个接口发送和...

    perl socket编程笔记

    Perl Socket 编程笔记 Perl Socket 编程笔记是 Perl 语言中 Socket 编程的使用方法和示例程序的集合,适合初学者。下面是 Perl Socket 编程的详细说明: 一、使用 Perl Socket API 首先需要载入 Socket 模块,即 ...

    socket学习笔记

    本文将深入探讨“Socket学习笔记”中的核心知识点,主要通过分析提供的两个Java文件——SocketServer.java和SocketClient.java来阐述。 首先,Socket在计算机网络中扮演着客户端与服务器端通信的关键角色。它是一种...

    网上收集的多个Socket编程经典例子源码

    - TCP Socket编程主要涉及三次握手建立连接、四次挥手断开连接的过程。在C# Socket基本编程示例中,你可以看到如何创建ServerSocket监听客户端连接,以及ClientSocket如何发起连接请求。 - 流式Socket通信通常是...

    Socket入门小例子

    通信完成后,记得关闭Socket以及相关的输入输出流和ServerSocket,避免资源浪费。例如: ```java input.close(); output.close(); socket.close(); if (serverSocket != null) { serverSocket.close(); } ``` 在...

Global site tag (gtag.js) - Google Analytics