Java:Socket通信

Socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求。ServerSocket用于服务器端,Socket是建立网络连接时使用的。在连接成功时,应用程序两端都会产生一个Socket实例,操作这个实例,完成所需的会话。对于一个网络连接来说,套接字是平等的,并没有差别,不因为在服务器端或在客户端而产生不同级别。套接字之间的连接过程可以分为三个步骤:服务器监听,客户端请求,连接确认。

实例一:基于TCP/IP协议的Socket通信一对一:

package z_test_Socket_Demo;

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

public class TestServerSocket {

	public static void main(String[] args) {
		// TODO 自动生成的方法存根
		ServerSocket serverSocket = null;
		Socket socket = null;
		OutputStream outputStream = null;
		try {
			serverSocket = new ServerSocket(8888); // 指定监听端口
			System.out.println("==>> accepting");
			socket = serverSocket.accept(); // 监听客户端的请求,方法阻塞,请求成功,返回socket对象
			outputStream = socket.getOutputStream(); // 获得输出流
			String string = "==>> Hello client,This is a message from server"; // 随便给客户端发点东西
			byte[] buffer = string.getBytes();
			outputStream.write(buffer);
			outputStream.flush();
		} catch (IOException e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
		} finally {
			try {
				serverSocket.close();
				socket.close();
				outputStream.close();
			} catch (IOException e) {
				// TODO 自动生成的 catch 块
				e.printStackTrace();
			}
		}
	}
}
package z_test_Socket_Demo;

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

public class TestClientSocket {

	public static void main(String[] args) {
		// TODO 自动生成的方法存根
		Socket socket = null;
		InputStream inputStream = null;
		try {
			// socket = new Socket(InetAddress.getLocalHost(), 8888);
			// 请求连接服务器的8888端口,构造方法通常可以指定IP地址
			socket = new Socket("10.25.26.141", 8888);
			inputStream = socket.getInputStream(); // 获得输入流
			byte[] buffer = new byte[64];
			int temp = 0;
			while ((temp = inputStream.read(buffer)) != -1) { // 将数据读入字节数组,此方法阻塞
				System.out.println(new String(buffer));
			}
		} catch (UnknownHostException e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
		} catch (IOException e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
		} finally {
			try {
				socket.close();
				inputStream.close();
			} catch (IOException e) {
				// TODO 自动生成的 catch 块
				e.printStackTrace();
			}
		}
	}
}

先运行服务器端,打印结果:

==>> accepting

然后运行客户端,打印结果:

==>> Hello client,This is a message from server

实例二:基于TCP/IP协议的Socket通信一对多:

只需要把服务器段用一个线程死循环即可

package z_test_Socket_Demo;

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

public class TestServerSocket {

	public static void main(String[] args) {
		// TODO 自动生成的方法存根
		new Thread(new ServerThread()).start();
	}

	private static class ServerThread implements Runnable {

		@Override
		public void run() {
			// TODO 自动生成的方法存根
			int i = 1;
			while (true) {
				ServerSocket serverSocket = null;
				Socket socket = null;
				OutputStream outputStream = null;
				try {
					serverSocket = new ServerSocket(8888); // 指定监听端口
					System.out.println("==>> accepting client" + i++);
					socket = serverSocket.accept(); // 监听客户端的请求,方法阻塞,请求成功,返回socket对象
					outputStream = socket.getOutputStream(); // 获得输出流
					String string = "==>> Hello client" + i++
							+ ",This is a message from server"; // 随便给客户端发点东西
					byte[] buffer = string.getBytes();
					outputStream.write(buffer);
					outputStream.flush();
				} catch (IOException e) {
					// TODO 自动生成的 catch 块
					e.printStackTrace();
				} finally {
					try {
						serverSocket.close();
						socket.close();
						outputStream.close();
					} catch (IOException e) {
						// TODO 自动生成的 catch 块
						e.printStackTrace();
					}
				}
			}
		}
	}
}

运行服务器段,打印结果:

==>> accepting client1

运行客户端,客户端打印结果:

==>> Hello client1,This is a message from server

再次运行客户端,客户端打印结果:

==>> Hello client2,This is a message from server

相当于两个不同的客户端请求连接服务器

弄懂的了基于TCP/IP协议的Socket通信,基于其他协议的Socket通信应该可以很快就能弄明白了。

时间: 2024-10-17 16:06:13

Java:Socket通信的相关文章

java socket通信-传输文件图片--传输图片

ClientTcpSend.java   客户端发送类 package com.yjf.test; import java.io.DataOutputStream; import java.io.File; import java.io.FileInputStream; import java.net.InetSocketAddress; import java.net.Socket; public class ClientTcpSend { public static String clien

java Socket通信使用BufferedReader和BufferedWriter的注意事项

注意事项:readLine()要求有换行标识,write()要输出换行标识,要调用flush()刷新缓冲区. 以下是取自java socket通信中的一小段代码. BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream())); BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.get

【Java】Java Socket 通信示例

用socket(套接字)实现客户端与服务端的通信. 这里举两个例子: 第一种是每次客户端发送一个数据,服务端就做一个应答.(也就是要轮流发) 第二种是客户端可以连续的向服务端发数据,服务端也可以连续向客户端发数据.(多线程) 为了方便起见,客户端服务端都放在一个主机上,分别开两个进程[哈哈,进程间通信lol~] PS: 一个聊天程序雏形 代码也放在GitHub上了:https://github.com/MummyDing/socketChatDemo Demo 1: 简单的Socket通信,一人

【Java】Java Socket 通信演示样例

用socket(套接字)实现client与服务端的通信. 这里举两个样例: 第一种是每次client发送一个数据,服务端就做一个应答. (也就是要轮流发) 另外一种是client能够连续的向服务端发数据,服务端也能够连续向client发数据.(多线程) 为了方便起见,client服务端都放在一个主机上.分别开两个进程[哈哈,进程间通信lol~] PS: 一个聊天程序雏形 代码也放在GitHub上了:https://github.com/MummyDing/socketChatDemo Demo

Java Socket通信实现私聊、群聊

前言 闲言少叙,上代码! 代码编写 server服务端 /** * 服务端 */ public class Server { private static ServerSocket server = null; private static Socket ss = null; /** * 客户端集合 */ private static Map<String, ServerThread> serverThreadMap = new HashMap<String, ServerThread&

java Socket通信,客户端与服务端相互发消息

1.通信过程 网络分为应用层,http.ssh.telnet就是属于这一类,建立在传输层的基础上.其实就是定义了各自的编码解码格式,分层如下: 2.Socket连接 上述通信都要先在传输层有建立连接的基础上才能完成,TCP通过三次握手建立连接:   Socket与http的区别可以看下这个: https://www.cnblogs.com/meier1205/p/5971313.html 还有搜索:http下午茶 3.JAVA socket 客户端与服务端互发消息 实现结构图:   客户端和服务

Java Socket通信介绍及可能遇到的问题解决_java - JAVA

文章来源:嗨学网 敏而好学论坛www.piaodoo.com 欢迎大家相互学习 前言 本文主要给大家介绍了关于Java中Socket通信的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. Java中基于TCP协议实现网络通信的两个类:客户端的Socket和服务器端的ServerSocket. Socket通信模型如图所示: 不管Socket通信的功能有多复杂,任何socket通信过程的基本结构都是一样的. 其基本步骤为: ①分别在客户端和服务器端创建Socket和Ser

java socket通信:聊天器(1)

目的:实现多个客户之间的通信 首先,这个聊天器的框架是这样的: 对于服务器端:建立socket,连接到服务器,并且开始监听. import java.io.*; import java.util.ArrayList; import java.util.List; import java.net.*; public class MultiTalkServer{ static int clientnum = 0; //创建一个arraylist数组来保存socket, public static L

170410、java Socket通信的简单例子(TCP)

服务端代码: package com.bobohe.socket; import java.io.*; import java.net.*; import java.applet.Applet; public class TalkServer { public static void main(String args[]) { try { ServerSocket server = null; try { server = new ServerSocket(4700); // 创建一个Serve

170411、java Socket通信的简单例子(UDP)

服务端代码: package com.bobohe.socket; import java.io.*; import java.net.*; class UDPServer { public static void main(String[] args) throws IOException { DatagramSocket server = new DatagramSocket(5050); byte[] recvBuf = new byte[100]; DatagramPacket recv