`

基于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
		}
	}

}
分享到:
评论

相关推荐

    Java网络编程的研究

    针对不同层次的网络通信,Java提供的网络功能有4大类:URL、InetAddress、Socket、Datagram。以基于Socket的Java网络编程为例,来探讨Java网络编程,具有一定的参考价值。

    Java编程语言详细教程

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

    JAVA清华大学教程

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

    JAVA 清华大学 教程

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

    清华大学JAVA教程

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

    本科毕业设计---基于java开发的企业内部通信系统.doc

    毕业设计计划是指学生完成毕业设计的整个过程的计划,包括调研企业信息化市场现状、学习Java编程基本原理及程序开发流程、建立业务模型、设计系统框架、开发相应代码、对相应代码进行测试修等几个方面的计划。...

    资深工程师整理面试题:Java

    Java 面试题整理 下面是对给定文件的详细知识点总结: 1. J2EE 是什么? 答:J2EE 是 Sun 公司提出的多层、...Java 面试题涵盖了 Java 语言的多个方面,包括 Java 基础、JavaEE、设计模式、多线程、网络编程等。

    TCP/IP协议与网络编程技术

    本书就是为了满足读者在这方面知识的需求而编写的一本TCP/IP协议与基于TCP/IP编程方面的书籍。 本书有以下几个方面的特点: (1)内容的组织上按照协议原理与协议编程分为上、下篇。上篇主要介绍TCP/IP协议簇中的...

    基于java的校园二手交易系统毕业设计.zip

    Java既支持各种层次的网络连接,又以Socket类支持可靠的流(stream)网络连接,所以用户可以产生分布式的客户机和服务器。 网络变成软件应用的分布运载工具。Java程序只要编写一次,就可到处运行。 编译和解释性 ...

    基于java web技术的毕业设计商城项目。.zip

    Java既支持各种层次的网络连接,又以Socket类支持可靠的流(stream)网络连接,所以用户可以产生分布式的客户机和服务器。 网络变成软件应用的分布运载工具。Java程序只要编写一次,就可到处运行。 编译和解释性 ...

    毕业设计基于Cesium时空数据可视化后台Java SSM框架.zip

    Java既支持各种层次的网络连接,又以Socket类支持可靠的流(stream)网络连接,所以用户可以产生分布式的客户机和服务器。 网络变成软件应用的分布运载工具。Java程序只要编写一次,就可到处运行。 编译和解释性 ...

    西安交大JAVA 基础讲义

    1.详细讲述了JAVA环境变量的配置和说明 2.透彻的介绍了类,对象的概念 ...8.JAVA网络的概念,列举了丰富的Socket编程实例 9.使用JDBC,ODBC连接数据库,介绍了Connection,Statement ,ResultSet的使用方法和注意事项。

    毕业设计---基于java的软件资源库的实现(后端).zip

    Java既支持各种层次的网络连接,又以Socket类支持可靠的流(stream)网络连接,所以用户可以产生分布式的客户机和服务器。 网络变成软件应用的分布运载工具。Java程序只要编写一次,就可到处运行。 编译和解释性 ...

    基于Java Web的智能二维码门禁管理系统(本科毕业论文+毕业设计).zip

    Java既支持各种层次的网络连接,又以Socket类支持可靠的流(stream)网络连接,所以用户可以产生分布式的客户机和服务器。 网络变成软件应用的分布运载工具。Java程序只要编写一次,就可到处运行。 编译和解释性 ...

    计算机毕业设计,课程设计,基于java电影院订票选座系统,带论文.zip

    Java既支持各种层次的网络连接,又以Socket类支持可靠的流(stream)网络连接,所以用户可以产生分布式的客户机和服务器。 网络变成软件应用的分布运载工具。Java程序只要编写一次,就可到处运行。 编译和解释性 ...

    毕业设计项目,基于Java语言,Tomcat9.0,MySQL8.0考研机构信息管理系统.zip

    Java既支持各种层次的网络连接,又以Socket类支持可靠的流(stream)网络连接,所以用户可以产生分布式的客户机和服务器。 网络变成软件应用的分布运载工具。Java程序只要编写一次,就可到处运行。 编译和解释性 ...

    JAVA基础课程讲义

    基于TCP协议的SOCKET编程和通信 193 UDP通讯的实现 201 思考作业 203 上机作业(分组完成,3人一组,周末完成) 204 第十一章 JAVA多媒体编程 205 字体 205 字体示例和效果 205 颜色 206 颜色编程示例 206 图形绘制 ...

    Java聊天室的设计与实现设计开题报告.doc

    " " "本题目为基于socket的网络编程,具体需要实现C/S模式的聊天程序,使用了java " " "语言,java语言有下面一些特点:简单、面向对象、分布式、解释执行、安全、体" " "系结构中立、可移植、高性能、多线程以及...

Global site tag (gtag.js) - Google Analytics