java socket一对多通信编程

先介绍一些基本常识。socket是基于TCP/IP协议的。通过IP协议找到目的主机,在通过TCP协议完成数据链路的联通。然后开始收发数据。(当然,个人理解。若有不对,敬请指正)socket的输入流是阻塞式的。在没有接受到数据之前会阻塞线程。在java中新建一个服务器端socket:ServerSocket serversocket = new ServerSocket(Port);//指定端口新建一个客户端socket:Socket socket = new Socket(“hostname
摘要由CSDN通过智能技术生成
首先。我也是一个刚开始学java socket编程。
大家可以来借鉴一点入门级的经验。

先介绍一些基本常识。socket是基于TCP/IP协议的。通过IP协议找到目的主机,在通过TCP协议完成数据链路的联通。然后开始收发数据。(当然,个人理解。若有不对,敬请指正)
socket的输入流是阻塞式的。在没有接受到数据之前会阻塞线程。
在java中
新建一个服务器端socket:
ServerSocket serversocket = new ServerSocket(Port);//指定端口

新建一个客户端socket:
Socket socket = new Socket(“hostname”,PORT);//需要访问的主机IP和端口。

好啦。开始进入主题。
我理解中的socket 1.0:就像是半条水管。为什么说是半条呢?因为。客户端的soket必须要和服务器端的socket进行连接才能进行通信。
看起来是不是很有道理的样子。

然而实际上。在我理解中的socket 2.0是两根半条水管。“我擦,你TM刚刚不是说只有半条,现在尼玛两根半条又是什么鬼!!”。


淡定~~
socket分为输入流和输出流。有进有出嘛~~~进进出出。 吭吭。别想歪了。
socket的输入流和输出流,只有分工合作。才能互不影响。客户端的输入流负责接收服务端的输出流。服务端的输入流负责客户端的输入流。
这里就是说需要用到多线程。
当然如果不用多线程。也不是不可以通信。只不过由于socket的输入流是阻塞式的。他会阻塞线程。所以情况就是只能一发一收。做不到连续发,连续收。

好啦。最终完整版。我理解中的socket 3.0:客户端和服务器端 的socket通过指定IP和端口。进行连接。连接完成。进行收发 socket(数据)。这个socket中包含输入流和输出流。

还是不懂的话。我还是做个好人给你们贴上代码吧。
package Client;

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

public class Client {
	public static void main(String[] args) {
		Socket socket=null;
		try {
			socket = new Socket("localhost",8888);
			//客户端 开启两个线程 :输入/输出
			ClientInputThread inputThread = new ClientInputThread(socket);
			inputThread.start();
			ClientOutputThread outputThread = new ClientOutputThread(socket);
			outputThread.start();
		} catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}
package Client;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.Socket;
/*
 * inputThread 输入流。等待接受来自服务端的数据
 */
public class ClientInputThread extends Thread {
	private Socket socket=null;
	InputStream is = null;
	InputStreamReader isr = null;
	BufferedReader br = null;
	public ClientInputThread(Socket socket) {
		this.socket = socket;
	}
	public void run() {
		try {
			System.out.println("客户端输入流待命...");
			while (true) {
				//获得字节输入流,并转换成字符流
				is = socket.getInputStream();
				isr = new InputStreamReader(is);
				br = new BufferedReader(isr);
				String infor = null;
				while((infor=br.readLine())!=null){
					System.out.println("客户端输入流:收到一条消息--:"+infor);
				}
			}
		} catch (IOException e) {
			e.printStackTrace();
		}finally {
			try {
				socket.shutdownInput();
				if (br != null) br.close();
				if (isr != null) isr.close();
				if (is != null) is.close();
				if (socket != null) socket.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		
	}

}

package Client;

import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.util.Scanner;
/*
 * 客户端输出流,输出到服务器的信息
 */
public class ClientOutputThread extends Thread {
	private Socket socket = null;
	private OutputStream os;
	private OutputStreamWriter osw;
	private BufferedWriter bw;
	public ClientOutputThread(Socket socket) {
		this.socket = socket;
	}
	public void run() {
		try {
			System.out.println("客户端输出流待命...");
			//获得字节输出流
			os = socket.getOutputStream();
			 osw = new OutputStreamWriter(os);
			 bw = new BufferedWriter(osw);
			Scanner scanner = new Scanner(System.in);
			while(true){
				System.out.println("客户端输出流:请输入需要发送的消息");
				bw.write(scanner.nextLine());
				bw.newLine();
				bw.flush();
				System.out.println("客户端输出流:发送完成");
			}
			
		} catch (IOException e) {
			e.printStackTrace();
		}finally{
			try {
				socket.shutdownOutput();
				if(bw!=null) bw.close();
				if(osw!=null) osw.close();
				if(os!=null) os.close();
				if(socket!=null) socket.close();
			} catch (Exception e2) {
				e2.printStackTrace();
			}
		}
		
	}
}

package Server;

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

public class Server {
	public static void main(String[] args) {
		try {
			ServerSocket serversocket = new ServerSocket(8888);
			Socket socket = null;
			System.out.println("服务端即将监听8888端口,等待客户端接入...");
			//循环监听
			while(true){
				socket = serversocket.accept();
				System.out.println("服务器端:监听到客户端,分配输出流线程");
				ServerOutputThread serverOutputThread = new ServerOutputThread(socket);
				serverOutputThread.start();
				System.out.println("服务器端:分配输入流线程");
				ServerInputThread serverInputThread = new ServerInputThread(socket);
				serverInputThread.start();
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

package Server;

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

public class ServerInputThread extends Thread {
	Socket socket = null;
	InputStream is = null;
	InputStreamReader isr = null;
	BufferedReader br = null;

	public ServerInputThread(Socket insocket) {
		socket = insocket;
	}

	public void run() {
		try {
			while(true){
				System.out.println("服务器输入流待命...");
				// 获得输入流
				is = socket.getInputStream();
				isr = new InputStreamReader(is);
				br = new BufferedReader(isr);
				String infor = null;
				while((infor=br.readLine())!=null){
					System.out.println("服务端输入流:收到一条消息--"+infor);
				}
			}
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				socket.shutdownInput();
				if (br != null) br.close();
				if (isr != null) isr.close();
				if (is != null) is.close();
				if (socket != null) socket.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
}

package Server;

import java.io.BufferedWriter;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;
/*
 * serverOutputThread
 * 服务器输出函数
 *
 */
public class ServerOutputThread extends Thread {
	Socket socket = null;
	private OutputStream os;
	private OutputStreamWriter osw;
	private BufferedWriter bw;
	public ServerOutputThread(Socket outsocket) {
		socket = outsocket;
	}
	public void run() {
		try {
			System.out.println("服务器输出流待命...");
			//获取字节输出流,并转换成字符输出流
			os = socket.getOutputStream();
			osw = new OutputStreamWriter(os);
			bw = new BufferedWriter(osw);
			//从键盘输入字符串
			Scanner scanner = new Scanner(System.in);
			while (true) {
				System.out.println("服务器输出流:请输入要发送的信息:");
				bw.write(scanner.nextLine());
				bw.newLine();
				bw.flush();
				System.out.println("服务器输出流:发送完成");
			}
			
		} catch (IOException e) {
			e.printStackTrace();
		}finally{
			try {
				socket.shutdownOutput();
				if(bw!=null) bw.close();
				if(osw!=null) osw.close();
				if(os!=null) os.close();
				if(socket!=null) socket.close();
			} catch (Exception e2) {
				e2.printStackTrace();
			}
		}
	}
	
	
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值