服务器端Demo:

Server.java(服务器端运行主程序,直接运行):

package cn.wjs;

import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket; public class Server {
private static final int port = 9999;
private static final int backlog = 100;
private static final String bindAddr = "127.0.0.1"; public static void main(String[] args) throws Exception {
System.out.println("正在启动Socket服务器"); ServerSocket server = new ServerSocket(9998, 100, InetAddress.getByName("127.0.0.1"));
System.out.println("启动完成\n正在监听客户端连接");
while (true) {
Socket socket = server.accept();
System.out.println("产生了一个新的会话,来自:" + socket.getInetAddress() + "\n==================================");
new ServerMessageReceiver(socket).start();
new ServerMessageSender(socket).start();
System.out.println("服务器端已启动");
}
}
}

ServerMessageReceiver.java:

package cn.wjs;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.Socket; public class ServerMessageReceiver extends Thread
{
private Socket socket; public ServerMessageReceiver(Socket socket)
{
this.socket = socket;
} public void run() {
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(this.socket.getInputStream(), "UTF-8")); String content = null;
while (true) {
if (this.socket.isClosed()) {
System.out.println("Socket已经关闭");
reader.close();
this.socket.close();
break;
}
content = reader.readLine();
if (content.equals("bye")) {
System.out.println("对方请求关闭连接,无法继续进行聊天");
reader.close();
this.socket.close();
break;
}
System.out.println("【对方】" + content + "\n");
}
reader.close();
this.socket.close();
}
catch (UnsupportedEncodingException e)
{
e.printStackTrace();
}
catch (IOException e) {
e.printStackTrace();
}
}
}

ServerMessageSender.java:

package cn.wjs;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.net.Socket; public class ServerMessageSender extends Thread
{
private Socket socket; public ServerMessageSender(Socket socket)
{
this.socket = socket;
} public void run() {
try {
BufferedWriter outwriter = new BufferedWriter(new OutputStreamWriter(this.socket.getOutputStream(), "UTF-8"));
BufferedReader inputReader = new BufferedReader(new InputStreamReader(System.in));
String msg = null;
while (true) {
msg = inputReader.readLine();
if (msg.toLowerCase().equals("exit")) {
System.exit(0);
}
if (this.socket.isClosed()) {
System.out.println("Socket已经关闭");
outwriter.close();
inputReader.close();
this.socket.close();
break;
}
outwriter.write(msg);
outwriter.newLine();
outwriter.flush();
}
}
catch (UnsupportedEncodingException e)
{
e.printStackTrace();
}
catch (IOException e) {
e.printStackTrace();
}
}
}

ClientDemo:

Client.java(客户端主程序,直接运行):

package cn.wjs;

import java.io.IOException;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException; public class Client
{
private static final int port = 9999;
private static final String bindAddr = "127.0.0.1"; public static void main(String[] args)
{
System.out.println("正在连接Socket服务器");
try {
Socket socket = new Socket(InetAddress.getByName("127.0.0.1"), 9998);
System.out.println("已连接\n================");
new ClientMessageSender(socket).start();
new ClientMessageReceiver(socket).start();
System.out.println("已启动");
}
catch (UnknownHostException e) {
e.printStackTrace();
}
catch (IOException e) {
e.printStackTrace();
}
}
}

ClientMessageReceiver.java:

package cn.wjs;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.Socket; public class ClientMessageReceiver extends Thread
{
private Socket socket; public ClientMessageReceiver(Socket socket)
{
this.socket = socket;
} public void run()
{
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(this.socket.getInputStream(), "UTF-8"));
String content = null;
while (true) {
if (this.socket.isClosed()) {
System.out.println("Socket已经关闭");
reader.close();
this.socket.close();
break;
}
content = reader.readLine();
if (content.equals("bye")) {
System.out.println("对方请求关闭连接,无法继续进行聊天");
reader.close();
this.socket.close();
break;
}
System.out.println("【对方】" + content + "\n");
}
}
catch (UnsupportedEncodingException e)
{
e.printStackTrace();
}
catch (IOException e) {
e.printStackTrace();
}
}
}

ClientMessageSender.java:

package cn.wjs;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.net.Socket; public class ClientMessageSender extends Thread
{
private Socket socket; public ClientMessageSender(Socket socket)
{
this.socket = socket;
} public void run()
{
try {
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(this.socket.getOutputStream(), "UTF-8"));
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String msg = null;
while (true) {
msg = reader.readLine();
if (msg.toLowerCase().equals("exit")) {
System.exit(0);
}
if (this.socket.isClosed()) {
System.out.println("Socket已经关闭");
writer.close();
this.socket.close();
break;
}
writer.write(msg);
writer.newLine();
writer.flush();
}
}
catch (UnsupportedEncodingException e)
{
e.printStackTrace();
}
catch (IOException e) {
e.printStackTrace();
}
}
}

通过elicpse导出jar包直接运行,服务器端导出jar设置main.class为Server.java,客户端导出jar设置main.class为Client.java

------

这是传统的TCP/BIO模式.如果多个客户端向服务器发送请求,通常采用连接池的方式来维护,这和数据库的连接池一个道理。当然,线程池中socket的数量有限,同时使用socket请求有可能造成客户端出现无限的等待,可以通过socket.setSoTimeout设置响应超时时间

一个简单的Socket通信Demo的更多相关文章

  1. php简单实现socket通信

    socket通信的原理在这里就不说了,它的用途还是比较广泛的,我们可以使用socket来做一个API接口出来,也可以使用socket来实现两个程序之间的通信,我们来研究一下在php里面如何实现sock ...

  2. Linux下简单的socket通信实例

    Linux下简单的socket通信实例 If you spend too much time thinking about a thing, you’ll never get it done. —Br ...

  3. 简单的Socket通信

    Socket简介 Socket又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求. 服务端步骤: • socket:创建服务器socket ...

  4. Android简单实现Socket通信,client连接server后,server向client发送文字数据

    案例实现的是简单的Socket通信,当client(Androidclient)连接到指定server以后,server向client发送一句话文字信息(你能够拓展其他的了) 先看一下服务端程序的实现 ...

  5. 一个简单的webservice的demo(下)winform异步调用webservice

    绕了一大圈,又开始接触winform的项目来了,虽然很小吧.写一个winform的异步调用webservice的demo,还是简单的. 一个简单的Webservice的demo,简单模拟服务 一个简单 ...

  6. 一个简单的Webservice的demo(中)_前端页面调用

    首先新建项目,这里有两种调用方式,为了能方便理解,新建页面WebserviceTest如下图: 先引用写好的服务,这里用上次写好的服务.见上次写的一个简单的Webservice的demo,简单模拟服务 ...

  7. C#socket编程之实现一个简单的TCP通信

    TCP(TransmissionControl Protocol)传输控制协议. 是一种可靠的.面向连接的协议(eg:打电话).传输效率低全双工通信(发送缓存&接收缓存).面向字节流.使用TC ...

  8. C#版 Socket编程(最简单的Socket通信功能)

    示例程序是同步套接字程序,功能很简单,只是客户端发给服务器一条信息,服务器向客户端返回一条信息:这里只是一个简单的示例,是一个最基本的socket编程流程,在接下来的文章中,会依次记录套接字的同步和异 ...

  9. Day 6-2简单的socket通信

    什么是socket? Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口.在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面 ...

随机推荐

  1. 基于XMPP的即时通信系统的建立(六)— 开发环境搭建

    服务器端 新建空工程 使用Eclipse新建名为openfire的空java工程. 导入源代码 这里使用的是openfire的openfire_src_3_10_3.zip源码. 导入后将目录src/ ...

  2. EF 更新指定的字段

    假如你有个表,有30个字段,你只想更新其中的1到2个字段的话,就可以用得上这篇文章 作用:类似于我们以前的sql代码 update xxx表 set name='ok',pwd='ok' where ...

  3. JAVA安卓和C# 3DES加密解密的兼容性问题(2013年8月修改版)

    近 一个项目.net 要调用JAVA的WEB SERVICE,数据采用3DES加密,涉及到两种语言3DES一致性的问题, 下面分享一下, 这里的KEY采用Base64编码,便用分发,因为Java的By ...

  4. 添加gif效果图

    1.贴加第三方包 http://blog.csdn.net/iamlazybone/article/details/5972234 2. <FrameLayout android:id=&quo ...

  5. POJ 2388 Who's in the Middle (快速选择算法:O(N)求数列第K大)

    [题意]求数列中间项. ---这里可以扩展到数列第K项. 第一次做的时候直接排序水过了= =--这一次回头来学O(N)的快速选择算法. 快速选择算法基于快速排序的过程,每个阶段我们选择一个数为基准,并 ...

  6. Azure SQL 数据库与新的数据库吞吐量单位

    在这一期中,Scott 与 Azure SQL 数据库性能首席项目经理主管 Tobias Ternstrom 一起详细阐释了新的数据库吞吐量单位 (Database Throughput Unit, ...

  7. H.264中NALU、RBSP、SODB的关系 (弄清码流结构)

    NALU:Coded H.264 data is stored or transmitted as a series of packets known as NetworkAbstraction La ...

  8. memcache的应用场景和实现原理

    面临的问题 对于高并发高访问的 Web应用程序来说,数据库存取瓶颈一直是个令人头疼的问题.特别当你的程序架构还是建立在单数据库模式,而一个数据池连接数峰 值已经达到500的时候,那你的程序运行离崩溃的 ...

  9. 【转】第一次使用Android Studio时你应该知道的一切配置

    原文网址:http://www.cnblogs.com/smyhvae/p/4390905.html [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.c ...

  10. LwIP源代码文件目录解析

    1 -- LwIP源代码文件目录 root@motadou:/home/motadou/lwip/lwip-1.4.1# tree . ├── CHANGELOG ├── COPYING ├── do ...