`

基于Socket的低层次Java网络编程

 
阅读更多

1、什么是socket?

所谓socket通常也称作“套接字”,用于描述IP地址和端口,是一个通信链的句柄。应用程序通常通过套接字想网络发送请求或者应该网络请求。

Socket通讯

网络上的两个程序通过一个双向的通讯连接实现数据的交换,这个双向链路的一端称为一个 Socket Socket 通常用来实现客户方和服务方的连接。 Socket TCP/IP 协议的一个十分流行的编程界面,一个 Socket 由一个 IP 地址和一个端口号唯一确定。
  在传统的 UNIX 环境下可以操作 TCP/IP 协议的接口不止 Socket 一个, Socket 所支持的协议种类也不光 TCP/IP 一种,因此两者之间是没有必然联系的。在 Java 环境下, Socket 编程主要是指基于 TCP/IP 协议的网络编程。

Socket通讯的一般过程

使用 Socket 进行 Client/Server 程序设计的一般连接过程是这样的: Server Listen( 监听 ) 某个端口是否有连接请求, Client 端向 Server 端发出 Connect( 连接 ) 请求, Server 端向 Client 端发回 Accept (接受)消息。一个连接就建立起来了。 Server 端和 Client 端都可以通过 Send Write 等方法与对方通信。

对于一个功能齐全的 Socket ,都要包含以下基本结构,其工作过程包含以下四个基本的步骤:
  ( 1 创建 Socket
  ( 2 打开连接到 Socket 的输入 / 出流;
  ( 3 按照一定的协议对 Socket 进行读 / 写操作;
  ( 4 关闭 Socket.

创建Socket

java 在包 java.net 中提供了两个类 Socket ServerSocket ,分别用来表示双向连接的客户端和服务端 。这是两个封装得非常好的类

 

package com.yt.manager.net.socket.thread;

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

/**
 * @Description: 服务端
 * @ClassName: MyServer
 * @Project: base-info
 * @Author: zxf
 * @Date: 2011-7-11
 */
public class MyServer {

	// 定义保存所有socket的ArrayList
	public static ArrayList<Socket> socketList = new ArrayList<Socket>();

	public static void main(String[] args) throws IOException {

		ServerSocket ss = new ServerSocket(30000);

		// 循环接受客户端的请求
		while (true) {
			// 此行代码将阻塞,将一直等待客户端的请求
			Socket socket = ss.accept();
			socketList.add(socket);
			// 每接受一个客户端的请求,则打开一个线程
			new Thread(new ServerThread(socket)).start();
		}
	}
}
 
package com.yt.manager.net.socket.thread;

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

/**
 * @Description: 服务端线程处理类
 * @ClassName: ServerThread
 * @Project: base-info
 * @Author: zxf
 * @Date: 2011-7-11
 */
public class ServerThread implements Runnable {

	// 定义当前线程所树立的Socket
	Socket s = null;
	// 该线程所处理的Socket对应的输入流
	BufferedReader br = null;

	public ServerThread(Socket s) throws IOException {
		this.s = s;
		// 初始化该Socket所对应的输入流
		br = new BufferedReader(new InputStreamReader(s.getInputStream()));
	}

	@Override
	public void run() {
		try {
			String content = null;
			while ((content = this.readFromClient()) != null) {
				for (Socket s : MyServer.socketList) {
					PrintStream print = new PrintStream(s.getOutputStream());
					print.println(content);
				}
			}
		} catch (Exception e) {
			// TODO: handle exception
		}
	}

	//定义读取客户端数据的方法
	public String readFromClient() {
		try {
			return br.readLine();
		} catch (IOException e) {
			//如果捕捉到异常,说明该Socket对应的客户端已关闭,删除该Socket
			MyServer.socketList.remove(s);
		}
		return null;
	}

}
 
package com.yt.manager.net.socket.thread;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;
import java.net.UnknownHostException;

/**
 * @Description: 客户端
 * @ClassName: MyClient
 * @Project: base-info
 * @Author: zxf
 * @Date: 2011-7-11
 */
public class MyClient {

	public static void main(String[] args) throws UnknownHostException,
			IOException {
		Socket s = new Socket("127.0.0.1", 30000);
		// 客户端启动ClientThread线程来不断接受来自服务器的请求的数据
		new Thread(new ClientThread(s)).start();

		// 获取该Socket对应的输出流
		PrintStream p = new PrintStream(s.getOutputStream());
		//p.println("三");
		String content = null;
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		while ((content = br.readLine()) != null) {
			// 将用户的键盘输入内容写入Socket对应的输出流
			p.println(content);
		}

	}
}
 
package com.yt.manager.net.socket.thread;

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

/**
 * @Description: 客户端线程处理类
 * @ClassName: ClientThread
 * @Project: base-info
 * @Author: zxf
 * @Date: 2011-7-11
 */
public class ClientThread implements Runnable {

	// 该线程负责处理的Socket
	Socket s = null;

	// 该线程所处理的Socket所对应的输入流
	BufferedReader br = null;

	public ClientThread(Socket s) throws IOException {
		this.s = s;
		br = new BufferedReader(new InputStreamReader(s.getInputStream()));
	}

	@Override
	public void run() {
		try {
			String content = null;
			// 不间断读取Socket输入流中的内容,并打印
			while ((content = br.readLine()) != null) {
				System.out.println(content);
			}
		} catch (Exception e) {
			// TODO: handle exception
		}
	}

}
分享到:
评论

相关推荐

    基于Socket的网络通信设计

    总结来说,基于Socket的网络通信设计涉及网络协议理解、编程语言运用、API调用以及图形界面的集成。通过这些知识点的综合运用,我们可以构建出功能完善的网络通信程序,实现不同设备之间的高效数据交换。

    java网络编程精简-孙卫琴

    7. **UDP编程**:与TCP相对应,Java也提供了`DatagramSocket`和`MulticastSocket`类来支持基于UDP的网络通信。UDP是无连接的、不可靠的传输协议,适用于对实时性要求较高的场景。 8. **网络安全**:网络编程中安全...

    java网络编程非常重要

    Java网络编程是开发分布式应用程序的关键技术,特别是在当前互联网时代,其重要性不言而喻。本文将深入探讨Java网络编程的基础知识,重点关注TCP和UDP两种主要的网络协议及其在Java中的实现。 首先,网络编程的核心...

    JAVA网络编程的探讨

    JAVA网络编程具有很强的灵活性和扩展性,使得开发者能够在不同层次上实现网络通信。无论是简单的URL获取资源,还是复杂的Socket通信和Web服务的实现,JAVA都提供了完善的API支持,使得网络编程变得更加高效和安全。 ...

    Java网络编程

    4. **基于URL的高层次Java网络编程** - **URL**: 用于定位互联网资源。 - **操作**: Java提供了多种类库(如`java.net.URL`)来处理URL,实现对资源的访问。 #### 三、总结 Java网络编程涉及多个核心概念和技术...

    java网络编程培训文档

    - **Socket类介绍**:Socket是Java网络编程的基础组件,它抽象了复杂的网络通信细节,使得开发者可以通过简单的API调用来实现网络通信。 - **Socket的功能**:主要包括连接远程机器、发送和接收数据、关闭连接以及...

    java网络高级编程

    Java网络高级编程是Java开发中的一个重要领域,它涵盖了...从基础的网络连接到高级的协议实现,都需要开发者有扎实的网络基础知识和熟练的Java编程技能。通过深入学习和实践,我们可以构建出高效、可靠的网络应用程序。

    Java 网络编程(chm)

    在Java中进行网络编程,首先需要理解的是网络的基础知识,例如IP地址、端口号、网络层次模型以及TCP和UDP两种主要的传输协议。TCP是一种面向连接的协议,提供可靠的数据传输,而UDP则是无连接的,适用于对实时性要求...

    Java TCPIP Socket编程.pdf

    Java TCPIP Socket编程是Java开发语言在后端服务中实现网络通信的重要技术,它基于Apache等开源库提供了丰富的API来创建高效、可靠的网络连接。本章将深入探讨Socket编程的基本概念和实现方法。 1. 计算机网络、...

    java网络编程技术课程设计

    Java网络编程技术课程设计主要涉及基于TCP/IP协议的网络通信,使用Java语言实现客户机/服务器(C/S)模式的应用程序。TCP/IP协议是互联网的基础,由网络接口层、网络层(IP)、传输层(TCP/UDP)和应用层等多个层次...

    Java网络socket编程详解

    Socket编程是基于TCP/IP协议栈的一种网络编程方式,TCP/IP协议栈包括多个层次,其中传输层的TCP协议提供了面向连接的可靠传输服务,适用于需要高可靠性和顺序保证的数据传输场景。 #### 三、Socket对象详解 在Java...

    Java TCP IP Socket编程 包含源码

    Java TCP/IP Socket编程是网络通信领域中的核心技术,广泛应用于服务器端和客户端之间的数据传输。本资源包含第二版书籍的相关源码,旨在帮助开发者深入理解并实践Socket编程。以下是关于Java TCP/IP Socket编程的...

    java网络编程讲解课件

    端口与套接字(Socket)的概念网络编程的三个层次基于连接的Socket通信程序设计无连接的数据报(UDP)通信程序设计Internet的主要协议有:网络层的IP协议;传输层的TCP和UDP协议;应用层的FTP、HTTP、SMTP等协议。TCP/...

    Java编程语言详细教程

    ◇8.3 基于Socket的低层次Java网络编程 ◇本讲小结 ◇课后习题 ★ 第九讲 JavaBean和RMI ◇课前索引 ◇9.1 JavaBean的基本概念 ◇9.2 JavaBean开发简介 ◇9.3 RMI的基本概念和编程简介 ◇9.4 EJB简介 ◇本...

    Java网络编程--TCP网络编程(tcp缩略语)

    Java网络编程中的TCP(Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议。在Java中,我们通常使用Socket类来实现TCP网络编程。Socket是Java.IO包的一部分,提供了网络通信的...

    网络编程PPT(Java程序设计之网络编程 )

    总的来说,网络编程PPT详细介绍了网络的基本概念、网络协议、OSI和TCP/IP模型,以及Java中进行网络编程的API,特别是Socket和ServerSocket的使用。通过学习这些知识,开发者能够创建出能够跨越网络进行通信的应用...

    Java SE编程入门教程 java网络编程(共29页).pptx

    在Java编程中,理解这些层次的作用对于编写网络应用程序至关重要,因为不同的层负责处理不同层面的问题,比如应用层的HTTP、FTP协议,传输层的TCP和UDP,网络层的IP协议,以及链路层的物理连接。 总的来说,Java SE...

Global site tag (gtag.js) - Google Analytics