服务器端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. bzoj2085

    首先看到k的范围就该知道这题不是倍增就是矩乘 首先肯定要求出任意一对串(a,b) a的后缀与b的前缀相同的最长长度是多少 考虑到kmp求出的失配指针是一个串最长后缀和前缀相等的长度 这里多个串我们只要 ...

  2. css动画集合地址

    CSS3 UI Lib库是由腾讯AlloyTeam前端开发团队建立,主要收集国内外友好体验和创意的界面组件Demo. 它除了使用CSS3技术外,还使用了HTML5,JS,JX,jQuery等技术,来达 ...

  3. poj 2230 Watchcow(欧拉回路)

    关键是每条边必须走两遍,重复建边即可,因为确定了必然存在 Euler Circuit ,所以所有判断条件都不需要了. 注意:我是2500ms跑过的,鉴于这道题ac的code奇短,速度奇快,考虑解法应该 ...

  4. OK335xS dhcpcd porting

    /********************************************************************** * OK335xS dhcpcd porting * 说 ...

  5. Builder模式在Java中的应用(转)

    在设计模式中对Builder模式的定义是用于构建复杂对象的一种模式,所构建的对象往往需要多步初始化或赋值才能完成.那么,在实际的开发过程中,我们哪些地方适合用到Builder模式呢?其中使用Build ...

  6. 关于FastDFS Java客户端源码中的一个不太明白的地方

    下面代码是package org.csource.fastdfs下TrackerGroup.java文件中靠近结束的一段代码,我下载的这个源码的版本是1.24. /** * return connec ...

  7. ffmpeg基础与编译_在VS2008下调试output_example.c(详细步骤)

    注意:这个是编译Debug版本的.必要资源:FFMPEG SDK 3.2(已经编译好的,可以去http://www.bairuitech.com/html/ruanjianxiazai/ffmpeg/ ...

  8. 最简单的视音频播放示例6:OpenGL播放YUV420P(通过Texture,使用Shader)

    本文记录OpenGL播放视频的技术.上一篇文章中,介绍了一种简单的使用OpenGL显示视频的方式.但是那还不是OpenGL显示视频技术的精髓.和Direct3D一样,OpenGL更好的显示视频的方式也 ...

  9. 理清javascript的相关概念 DOM和BOM

    javascript 有三部分构成,ECMAScript,DOM和BOM,根据宿主(浏览器)的不同,具体的表现形式也不尽相同,ie和其他的浏览器风格迥异.JavaScript=语法+BOM(含DOM) ...

  10. MySQL基础之第10章 查询数据

    10.1.基本查询语句 SELECT 属性列表 FROM 表名和视图列表[WHERE条件表达式1][GROUPBY 属性名1 [HAVING条件表达式2]][ORDERBY 属性名2[ASC|DESC ...