Java基础:三步学会Java Socket编程3[转]

第三步 实现信息共享:在Socket上的实时交流 

   网络的伟大之一也是信息共享,Server可以主动向所有Client广播消息,同时Client也可以向其它Client发布消息。下面看看如何开发一个可以实时传递消息的程序。

   设计原理: 

   服务器端接受客户端的连接请求,同时启动一个线程处理这个连接,线程不停的读取客户端输入,然后把输入加入队列中,等候处理。在线程启动的同时将线程加入队列中,以便在需要的时候定位和取出。 

import java.io.*; 
import java.net.*; 
import java.util.*; 
import java.lang.*; 

public class Server extends ServerSocket 
{ 
private static ArrayList User_List = new ArrayList(); 
private static ArrayList Threader = new ArrayList(); 
private static LinkedList Message_Array = new LinkedList(); 
private static int Thread_Counter = 0; 
private static boolean isClear = true; 
protected static final int SERVER_PORT = 10000; 
protected FileOutputStream LOG_FILE = new FileOutputStream("d:/connect.log", true); 

public Server() throws FileNotFoundException, IOException 
{ 
super(SERVER_PORT); 
new Broadcast(); 

//append connection log 
Calendar now = Calendar.getInstance(); 
String str = "[" + now.getTime().toString() + "] Accepted a connection\015\012"; 
byte[] tmp = str.getBytes(); 
LOG_FILE.write(tmp); 

try 
{ 
while (true) 
{ 
Socket socket = accept(); 
new CreateServerThread(socket); 
} 
} 
finally 
{ 
close(); 
} 
} 

public static void main(String[] args) throws IOException 
{ 
new Server(); 
} 

//--- Broadcast 
class Broadcast extends Thread 
{ 
public Broadcast() 
{ 
start(); 
} 

public void run() 
{ 
while (true) 
{ 
if (!isClear) 
{ 
String tmp = (String)Message_Array.getFirst(); 

for (int i = 0; i < Threader.size(); i++) 
{ 
CreateServerThread client = (CreateServerThread)Threader.get(i); 
client.sendMessage(tmp); 
} 

Message_Array.removeFirst(); 
isClear = Message_Array.size() > 0 ? false : true; 
} 
} 
} 
} 

//--- CreateServerThread 
class CreateServerThread extends Thread 
{ 
private Socket client; 
private BufferedReader in; 
private PrintWriter out; 
private String Username; 

public CreateServerThread(Socket s) throws IOException 
{ 
client = s; 
in = new BufferedReader(new InputStreamReader(client.getInputStream())); 
out = new PrintWriter(client.getOutputStream(), true); 
out.println("--- Welcome to this chatroom ---"); 
out.println("Input your nickname:"); 
start(); 
} 

public void sendMessage(String msg) 
{ 
out.println(msg); 
} 

public void run() 
{ 
try 
{ 
int flag = 0; 
Thread_Counter++; 
String line = in.readLine(); 

while (!line.equals("bye")) 
{ 
if (line.equals("l")) 
{ 
out.println(listOnlineUsers()); 
line = in.readLine(); 
continue; 
} 

if (flag++ == 0) 
{ 
Username = line; 
User_List.add(Username); 
out.println(listOnlineUsers()); 
Threader.add(this); 
pushMessage("[< " + Username + " come on in >]"); 
} 
else 
{ 
pushMessage("<" + Username + ">" + line); 
} 

line = in.readLine(); 
} 

out.println("--- See you, bye! ---"); 
client.close(); 
} 
catch (IOException e) 
{} 
finally 
{ 
try 
{ 
client.close(); 
} 
catch (IOException e) 
{} 

Thread_Counter--; 
Threader.remove(this); 
User_List.remove(Username); 
pushMessage("[< " + Username + " left>]"); 
} 
} 


private String listOnlineUsers() 
{ 
String s ="-+- Online list -+-\015\012"; 

for (int i = 0; i < User_List.size(); i++) 
{ 
s += "[" + User_List.get(i) + "]\015\012"; 
} 

s += "-+---------------------+-"; 
return s; 
} 

private void pushMessage(String msg) 
{ 
Message_Array.addLast(msg); 
isClear = false; 
} 
} 
}
 

   这就是程序运行后,多用户登陆并且输入信息后的屏幕。实现了信息的实时广播。用户输入"l"就可以列出在线人员表。

 

 

转至:http://tech.163.com/06/0410/09/2EBABUD20009159T_2.html

Socket 简介与 Java Socket 编程示例 基本概念:Socket可以被视为网络环境中进程间通信的API(应用程序编程接口),也是可以被命名和寻址的通信端点。它是应用程序通过网络协议进行通信的接口,上联应用进程,下联网络协议栈。物理与逻辑层面:在物理层面上,Socket可能并不真实存在,它更多的是一个逻辑上的概念。但在网络编程中,Socket是不可或缺的组成部分。Socket是网络通信中的核心组件之一,它提供了应用层进程之间进行数据交换的机制。通过Socket,不同主机上的应用进程可以建立连接并传输数据。 阅读详情

相关推荐

Java TCP/IP SocketSocket编程大合集

为了方便各位网友学习以及方便自己复习之用,将Java TCP/IP Socket编程系列内容按照学习顺序总结如下: 【Java TCP/IP SocketJava TCP Socket编程Java TCP/IP SocketJava UDP Socket编程Java TCP/IP Socket】应用程序协议中消息的成帧与解析 【Java TCP/IP Socket】构建和解析自定义协议消息 【Java TCP/IP Socket】基于线程池的TCP服务器 【Java TCP/IP

兰亭风雨的专栏 1万+

Java基础三步学会Java Socket编程

这两天没事看《TCP/IP协议详解-卷1》,把那些TFTP,FTP,TELNET,RPC/NFS都看了一下。 终于又长见识了,一句话总结: 一个TCP连接是由4元组: [remote IP,remote port,local IP,local port] 唯一决定的。 人人皆知的做法: 服务器:bind在固定端口PORT等待连接。 客户端:connect服务器的固定端口POR

Hello World! 3433

SocketJava Socket编程基础及深入讲解

 SocketJava网络编程基础,了解还是有好处的,   这篇文章主要讲解Socket基础编程Socket用在哪呢,主要用在进程间,网络间通信。本篇比较长,特别做了个目录: 一、Socket通信基本示例 二、消息通信优化 2.1 双向通信,发送消息并接受消息 2.2 使用场景 2.3 如何告知对方已发送完命令 2.3.1 通过Socket关闭 2.3.2 通过Socket关闭输出流的方式 2.3.3 通过约定符号 2.3.4 通过指定长度 三、服

slw213106的博客 947

三步学会Java Socket编程

三步学会Java Socket编程

qq_44231628的博客 167

Java Socket编程基础实战

JavaSocket编程基础利用Socket进行本地端口通信线程及Socket编程 Socketjava网络编程的重要组成部分,包括我们所使用的网络通信或网络游戏,一般都是基于Socket进行编程的。 所谓套接字(Socket),就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。一个套接字就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制。从所处的地位来讲,套接字上联应用进程,下联网络协议栈,是应用程序通过网络协议进行通信的接口,是应用程序与网络协议根进行交互的接口----

菜根檀的博客 1013

三步学会Java Socket编程3

三步 实现信息共享:Socket上的实时交流  网络的伟大之一也是信息共享,Server可以主动向所有Client广播消息,同时Client也可以向其它Client发布消息。下面看看如何开发一个可以实时传递消息的程序。  设计原理:  服务器端接受客户端的连接请求,同时启动一个线程处理这个连接,线程不停的读取客户端输入,然后把输入加入队列中,等候处理。在线程启动的同时将线程加入队列中,以便在需

※学习笔记※ 1014

Java Socket编程

事实上网络编程简单的理解就是两台计算机相互通讯数据而已.对于程序员而言,去掌握一种编程接口并使用一种编程模型相对就会显得简单的多了。JavaSDK提供一些相对简单的Api来完成这些工作。Socket就是其中之一。对于Java而言,这些Api存在与java.net 这个包里面。因此只要导入这个包就可以准备网络编程了。   网络编程的基本模型就是客户机到服务器模型。简单的说就是两个进程之间相互...

一火的专栏 3719

三步学会Java Socket编程

  三步学会Java Socket编程第一步 充分理解Socket  1.什么是socket  所谓socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄。应用程序通常通过"套接字"向网络发出请求或者应答网络请求。  以J2SDK-1.3为例,Socket和ServerSocket类库位于java.net包中。ServerSocket用于服务器端,Socket是建立网络

陈华江(HuaChiang Chen) 陈泉冰专栏 961

浅谈Socket编程Java实现

Java是一种可用于进行网络编程的语言,它提供了两种功能强大的网络支持机制:URL访问网络资源的类和用Socket通讯的类,来满足不同的要求。一是URL用于访问Internet网上资源的应用;另一种是针对client/server(客户端/服务器)模式的应用以及实现某些特殊的协议的应用,它的通讯过程是基于TCP/IP协议中传输层接口socket实现的。本文想简单的介绍一下Socket编程Java

2724

Java Socket编程基础及深入讲解

原文:https://www.cnblogs.com/yiwangzhibujian/p/7107785.html#q2.3.3 SocketJava网络编程基础,了解还是有好处的,   这篇文章主要讲解Socket基础编程Socket用在哪呢,主要用在进程间,网络间通信。本篇比较长,特别做了个目录: 一、Socket通信基本示例 二、消息通信优化 2.1 ...

weixin_30312659的博客 100

JavaJava Socket编程:建立网络连接的基础

在计算机网络中,Socket是一个抽象概念,代表了网络中两台计算机之间的通信端点。它允许不同的程序在网络上进行数据交换和通信。具体来说,一个Socket可以被理解为两种不同类型的通信:TCP(传输控制协议)Socket和UDP(用户数据报协议)Socket。TCP Socket:TCP是一种面向连接的协议,它提供了可靠的、有序的、双向的字节流传输。在TCP Socket通信中,客户端和服务器之间建立一条持久的连接,并且可以通过该连接进行双向的数据传输。

double222222的博客 1218
上一篇: Java基础:三步学会Java Socket编程2[转]
下一篇: Java基于Socket文件传输示例[转]
iteye_17420
博客等级 码龄8年 1粉丝 99原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值