Java的Socket网络编程以及多线程

简介:
 1.Socket是代表两台机器之间网络连接的对象(java.net.Socket)。
  Socket的建立如下,参数分别是服务器端的IP地址和端口号: Socket socket  =  new Socket("167.5.75.1",5000);
   2.客户端(Client)Socket的使用
  2.1 从Socket读出数据步骤:
// 1.创建Socket连接,告知 Server的IP地址以及端口号
Socket socket = new Socket("127.0.0.1", 4242);
// 2.创建InputStreamReader,用于读取socket输入流
InputStreamReader stream = new InputStreamReader(socket.getInputStream());
// 3.使用BufferedReader链接输入流
BufferedReader br = new BufferedReader(stream);
// 4.读出数据
String line = null;
while ((line = br.readLine()) != null)
{
System.out.println("Today's advice is: " + line);
}
// 5. 关闭输入流BufferedReader
br.close();
  2.2 向Scoket写入数据步骤:
// 1.创建Socket连接,告知Server的IP地址以及端口号
Socket socket = new Socket("127.0.0.1", 4242);
// 2.创建PrintWriter对象,用以接收socket输出流
PrintWriter writer = new PrintWriter(socket.getOutputStream());
// 3.使用PrintWriter对象写出输出数据
String advice ="Today's advice";
writer.println(advice);
// 4. 关闭连接
writer.close();
  3.  服务器端(Server)Socket的使用
// 1.创建一个SercerSocket,使用4242端口监听客户端请求
ServerSocket serverSocket = new ServerSocket(4242);
System.out.println("The server is started, listening on port 4242");
while (true)
{
// 2.ServerSocket的accept()在等待用户连接的时候闲置;在用户连接上来的时候,返回一个Socket来与客户端通信
Socket socket = serverSocket.accept();
// 3.创建PrintWriter对象,用以接收socket输出流
PrintWriter writer = new PrintWriter(socket.getOutputStream());
// 4.使用PrintWriter对象写出输出数据
String advice = "notifier's blog";
writer.println(advice);
// 5. 关闭连接
writer.close();
}

 4.   线程的状态
  线程总共有5种状态:
  1. 新建 (Thread t = new Thread())
  2. 就绪 (t.start())
  3. 运行
  4. 堵塞
  线程被block的原因很多,比如: 等待IO操作, sleep(), 等待被占用对象释放
  5.死亡
   5.解决线程同步化问题的方法是: 对使用到共享对象的方法使用synchronized
  需要注意的是:
  虽说是方法进行了synchronized,但锁不是加在方法上的而是对象上的,也就是说,是synchronized方法获取对象锁。如果对象(类)有两个或者多个synchronized方法,就表示两个线程不能同时进入同一个方法,也不能同时进入不同的方法。 因为同一时间,只有一个方法在占有对象锁。
   6.synchronized代码块
  有时候在一个方法中做了很多事情,但只有一部分逻辑是需要synchronized的,这时候我们可以使用synchronized代码块。如下,其中this表示当前对象:
public void function()
{
doSomething();
//以下方法需要同步化
synchronized (this)
{
doCriticalStuff();
moreCriticalStuff();
}
doSomeOtherThing();
}
   7. 以下是一个Socket简单的例子:
  客户端代码及详细注释:
/**
* @author notifier
* @create 2010-9-25 上午10:12:10
* @version 1.0
*/
public class DailyAdviceClient
{
public static void main(String[] args)
{
DailyAdviceClient client = new DailyAdviceClient();
client.receiveMsg();
}
public void receiveMsg()
{
try
{
// 1.创建Socket连接,告知Server的IP地址以及端口号
Socket socket = new Socket("127.0.0.1", 4242);
// 2.创建InputStreamReader,用于读取socket输入流
InputStreamReader stream = new InputStreamReader(socket
.getInputStream());
// 3.使用BufferedReader链接输入流
BufferedReader br = new BufferedReader(stream);
// 4.读出数据
String line = null;
while ((line = br.readLine()) != null)
{
System.out.println("Today's advice is: " + line);
}
// 5. 关闭输入流BufferedReader
br.close();
} catch (UnknownHostException e)
{
e.printStackTrace();
} catch (IOException e)
{
e.printStackTrace();
}
}
}
 服务器端代码及详细注释:
/**
* @author notifier
* @create 2010-9-25 下午07:06:54
* @version 1.0
*/
public class SimpleChatServer
{
// 保存客户端列表
private ArrayList clientList = new ArrayList();;
public static void main(String[] args)
{
new SimpleChatServer().startUp();
}
/**
* 负责服务器端的启动
*
*/
public void startUp()
{
try
{
// 创建服务器端ServerSocket连接,监听端口号5000
ServerSocket serverSocket = new ServerSocket(5000);
// 轮询等待客户端请求
while(true)
{
// 等待客户端请求,无请求则闲置;有请求到来时,返回一个对该请求的socket连接
Socket clientSocket = serverSocket.accept();
// 将该客户端加入到列表中
PrintWriter writer = new PrintWriter(clientSocket.getOutputStream());
clientList.add(writer);
// 创建ClientHandler对象,通过socket连接通信
Thread t = new Thread(new ClientHandler(clientSocket));
t.start();
System.out.println("有Client连进来");
}
}catch(Exception e)
{
e.printStackTrace();
}
}
/**
* 客户端处理类, 主要负责:
* 1.接收客户端发来的消息
* 2.将消息转发其他客户端
* @author sdniu
* @create 2010-9-26 上午10:00:18
* @version 1.0
*/
public class ClientHandler implements Runnable
{
private BufferedReader reader;
private Socket socket;
/**
* ClientHandler的构造函数
* @param clientSocket
*/
public ClientHandler(Socket clientSocket)
{
try
{
// 得到socket连接
socket = clientSocket;
// 得到客户端发来的消息
InputStreamReader isReader = new InputStreamReader(socket.getInputStream());
reader = new BufferedReader(isReader);
} catch (IOException e)
{
e.printStackTrace();
}
}
public void run()
{
String message;
try
{
while((message = reader.readLine()) != null)
{
System.out.println("客户端消息: " + message);
// 将客户端发来的消息转发所有客户端
notifyAllClients(message);
}
} catch (IOException e)
{
e.printStackTrace();
}
}
}
/**
*
* @param message
*/
public void notifyAllClients(String message)
{
// 得到客户端列表的迭代器,语法格式为 Iterator it = clientList.iterator();
Iterator it = clientList.iterator();
while(it.hasNext())
{
try
{
// 得到的Iterator别忘了强制转换回PrintWriter
PrintWriter writer = (PrintWriter) it.next();
writer.println(message);
writer.flush();
} catch (Exception e)
{
e.printStackTrace();
}
}
}
}
    


最新内容请见作者的GitHub页:http://qaseven.github.io/
   
目录
相关文章
|
2月前
|
存储 网络协议 安全
Java网络编程,多线程,IO流综合小项目一一ChatBoxes
**项目介绍**:本项目实现了一个基于TCP协议的C/S架构控制台聊天室,支持局域网内多客户端同时聊天。用户需注册并登录,用户名唯一,密码格式为字母开头加纯数字。登录后可实时聊天,服务端负责验证用户信息并转发消息。 **项目亮点**: - **C/S架构**:客户端与服务端通过TCP连接通信。 - **多线程**:采用多线程处理多个客户端的并发请求,确保实时交互。 - **IO流**:使用BufferedReader和BufferedWriter进行数据传输,确保高效稳定的通信。 - **线程安全**:通过同步代码块和锁机制保证共享数据的安全性。
120 23
|
8月前
|
开发者 Python
Python Socket编程:不只是基础,更有进阶秘籍,让你的网络应用飞起来!
在数字时代,网络应用成为连接世界的桥梁。Python凭借简洁的语法和丰富的库支持,成为开发高效网络应用的首选。本文通过实时聊天室案例,介绍Python Socket编程的基础与进阶技巧。基础篇涵盖服务器和客户端的建立与数据交换;进阶篇则探讨多线程与异步IO优化方案,助力提升应用性能。通过本案例,你将掌握Socket编程的核心技能,推动网络应用飞得更高、更远。
136 1
|
7月前
|
Java 应用服务中间件
面对海量网络请求,Tomcat线程池如何进行扩展?
【10月更文挑战第4天】本文详细探讨了Tomcat线程池相较于标准Java实用工具包(JUC)线程池的关键改进。首先,Tomcat线程池在启动时即预先创建全部核心线程,以应对启动初期的高并发请求。其次,通过重写阻塞队列的入队逻辑,Tomcat能够在任务数超过当前线程数但未达最大线程数时,及时创建非核心线程,而非等到队列满才行动。此外,Tomcat还引入了在拒绝策略触发后重新尝试入队的机制,以提高吞吐量。这些优化使得Tomcat线程池更适应IO密集型任务,有效提升了性能。
面对海量网络请求,Tomcat线程池如何进行扩展?
|
6月前
|
Kubernetes 网络协议 Python
Python网络编程:从Socket到Web应用
在信息时代,网络编程是软件开发的重要组成部分。Python作为多用途编程语言,提供了从Socket编程到Web应用开发的强大支持。本文将从基础的Socket编程入手,逐步深入到复杂的Web应用开发,涵盖Flask、Django等框架的应用,以及异步Web编程和微服务架构。通过本文,读者将全面了解Python在网络编程领域的应用。
108 1
|
7月前
|
消息中间件 监控 网络协议
Python中的Socket魔法:如何利用socket模块构建强大的网络通信
本文介绍了Python的`socket`模块,讲解了其基本概念、语法和使用方法。通过简单的TCP服务器和客户端示例,展示了如何创建、绑定、监听、接受连接及发送/接收数据。进一步探讨了多用户聊天室的实现,并介绍了非阻塞IO和多路复用技术以提高并发处理能力。最后,讨论了`socket`模块在现代网络编程中的应用及其与其他通信方式的关系。
638 3
|
7月前
|
网络协议 Linux 应用服务中间件
Socket通信之网络协议基本原理
【10月更文挑战第10天】网络协议定义了机器间通信的标准格式,确保信息准确无损地传输。主要分为两种模型:OSI七层模型与TCP/IP模型。
|
7月前
|
Java Linux
【网络】高并发场景处理:线程池和IO多路复用
【网络】高并发场景处理:线程池和IO多路复用
199 2
|
8月前
|
网络协议 Python
告别网络编程迷雾!Python Socket编程基础与实战,让你秒变网络达人!
在网络编程的世界里,Socket编程是连接数据与服务的关键桥梁。对于初学者,这往往是最棘手的部分。本文将用Python带你轻松入门Socket编程,从创建TCP服务器与客户端的基础搭建,到处理并发连接的实战技巧,逐步揭开网络编程的神秘面纱。通过具体的代码示例,我们将掌握Socket的基本概念与操作,让你成为网络编程的高手。无论是简单的数据传输还是复杂的并发处理,Python都能助你一臂之力。希望这篇文章成为你网络编程旅程的良好开端。
106 3
|
8月前
|
网络协议 Python
网络世界的建筑师:Python Socket编程基础与进阶,构建你的网络帝国!
在数字宇宙中,网络如同复杂脉络连接每个角落,Python Socket编程则是开启这一世界的钥匙。本文将引导你从基础概念入手,逐步掌握Socket编程,并通过实战示例构建TCP/UDP服务器与客户端。你将学会使用Python的socket模块进行网络通信,了解TCP与UDP的区别,并运用多线程与异步IO提升服务器性能。跟随本文指引,成为网络世界的建筑师,构建自己的网络帝国。
60 2
|
8月前
|
网络协议 开发者 Python
网络编程小白秒变大咖!Python Socket基础与进阶教程,轻松上手无压力!
在网络技术飞速发展的今天,掌握网络编程已成为开发者的重要技能。本文以Python为工具,带你从Socket编程基础逐步深入至进阶领域。首先介绍Socket的概念及TCP/UDP协议,接着演示如何用Python创建、绑定、监听Socket,实现数据收发;最后通过构建简单的聊天服务器,巩固所学知识。让初学者也能迅速上手,成为网络编程高手。
133 1