Java版SockeDemo案例,有很详细的注释
一般是用一个线程池来处理接受到的请求
直接上代码(一)
ServerThread层
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket; public class ServerThread extends Thread {
private static int number = 0; // 保存本进程的客户计数 Socket socket = null; // 保存与本线程相关的Socket对象 public ServerThread(Socket socket, int clientnum) { this.socket = socket;
number = clientnum;
System.out.println("当前在线的用户数: " + number);
} @Override
public void run() {
try { // 由Socket对象得到输入流,并构造相应的BufferedReader对象
BufferedReader in = new BufferedReader(new InputStreamReader(socket
.getInputStream())); // 由Socket对象得到输出流,并构造PrintWriter对象
PrintWriter out = new PrintWriter(socket.getOutputStream()); // 由系统标准输入设备构造BufferedReader对象
BufferedReader sysin = new BufferedReader(new InputStreamReader(
System.in)); // 在标准输出上打印从客户端读入的字符串
System.out.println("[Client " + number + "]: " + in.readLine()); String line; // 保存一行内容 // 从标准输入读入一字符串
line = sysin.readLine(); while (!line.equals("bye")) { // 如果该字符串为 "bye",则停止循环 // 向客户端输出该字符串
out.println(line); // 刷新输出流,使Client马上收到该字符串
out.flush(); // 在系统标准输出上打印读入的字符串
System.out.println("[Server]: " + line); // 从Client读入一字符串,并打印到标准输出上
System.out.println("[Client " + number + "]: " + in.readLine()); // 从系统标准输入读入一字符串
line = sysin.readLine();
} out.close(); // 关闭Socket输出流
in.close(); // 关闭Socket输入流
socket.close(); // 关闭Socket
} catch (Exception e) {
System.out.println("Error. " + e);
}
}
}
SocketClient层
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket; /**
* 客户端Socket
*
* @author Administrator
*
*/
public class SocketClient { /**
* 客户端Socket构造方法
*/
public SocketClient() {
try { // 向本机的2121端口发出客户请求
Socket socket = new Socket("localhost", 2121); System.out.println("Established a connection..."); // 由系统标准输入设备构造BufferedReader对象
BufferedReader sysin = new BufferedReader(new InputStreamReader(
System.in)); // 由Socket对象得到输出流,并构造PrintWriter对象
PrintWriter out = new PrintWriter(socket.getOutputStream()); // 由Socket对象得到输入流,并构造相应的BufferedReader对象
BufferedReader in = new BufferedReader(new InputStreamReader(socket
.getInputStream())); String line; // 保存一行内容 // 从系统标准输入读入一字符串
line = sysin.readLine(); while (!line.equals("bye")) { // 若从标准输入读入的字符串为 "bye"则停止循环 // 将从系统标准输入读入的字符串输出到Server
out.println(line); // 刷新输出流,使Server马上收到该字符串
out.flush(); // 在系统标准输出上打印读入的字符串
System.out.println("[Client]: " + line); // 从Server读入一字符串,并打印到标准输出上
System.out.println("[Server]: " + in.readLine()); // 从系统标准输入读入一字符串
line = sysin.readLine(); } out.close(); // 关闭Socket输出流
in.close(); // 关闭Socket输入流
socket.close(); // 关闭Socket
} catch (Exception e) {
System.out.println("Error. " + e);
}
} /**
* 主方法
*
* @param args
*/
public static void main(String[] args) {
new SocketClient();
}
}
SocketServer层
import java.net.ServerSocket; /**
* 服务器端Socket
*
* @author Administrator
*
*/
public class SocketServer {
/**
* 服务器端Socket构造方法
*/ public SocketServer() {
try { int clientcount = 0; // 统计客户端总数 boolean listening = true; // 是否对客户端进行监听 ServerSocket server = null; // 服务器端Socket对象 try {
// 创建一个ServerSocket在端口2121监听客户请求
server = new ServerSocket(2121); System.out.println("Server starts开始启动...");
} catch (Exception e) {
System.out.println("Can not listen to. " + e);
} while (listening) {
// 客户端计数
clientcount++; // 监听到客户请求,根据得到的Socket对象和客户计数创建服务线程,并启动之
new ServerThread(server.accept(), clientcount).start();
}
} catch (Exception e) {
System.out.println("Error. " + e);
}
}
/**
* 主方法
*
* @param args
*/
public static void main(String[] args) {
new SocketServer();
}
}
下面是Demo案例
Server端
package cn.kgc.sockettest.demo1; import java.io.*;
import java.net.ServerSocket;
import java.net.Socket; /**
* 服务端
*/
public class Server {
public static void main(String[] args) {
try {
ServerSocket serverSocket = new ServerSocket(8080);
System.out.println("服务器启动完成...监听中");
//开启监听,等待客户端的访问
Socket socket = serverSocket.accept();
//获取输入流,因为是客户端向服务端发送了数据
InputStream inputStream = socket.getInputStream();
//创建一个缓冲流
BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));
String info = null;
while ((info = br.readLine()) != null) {
System.out.println("这里是服务端 客户端是:" + info);
}
//向客户端做出相应
OutputStream outputStream = socket.getOutputStream();
info = "这里是服务端我们接受到了你消息";
outputStream.write(info.getBytes());
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}

Client端
package cn.kgc.sockettest.demo1; import java.io.*;
import java.net.Socket; /**
* 客户端
*/
public class Client {
public static void main(String[] args) {
try {
//IP地址
Socket socket = new Socket("localhost",8080);
OutputStream outputStream = socket.getOutputStream();
String info ="你好";
//输出!
outputStream.write(info.getBytes());
socket.shutdownOutput();
//接受服务器的响应
InputStream inputStream = socket.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));
while((info =br.readLine())!=null){
System.out.println("接收到了服务器的响应:"+info);
}
outputStream.flush();
outputStream.close();
inputStream.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}

(二)
User层
package cn.kgc.sockettest.demo1.demo2;
import java.io.Serializable;
public class User implements Serializable {
private String userName;
private String password;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
@Override
public String toString() {
return "Server{" +
"userName='" + userName + '\'' +
", password='" + password + '\'' +
'}';
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
Server端
package cn.kgc.sockettest.demo1.demo2; import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.net.ServerSocket;
import java.net.Socket; public class Server {
public static void main(String[] args) {
try {
ServerSocket serverSocket = new ServerSocket(8080);
System.out.println("服务器启动完成。。。。。");
//开始监听
Socket socket = serverSocket.accept();
InputStream inputStream = socket.getInputStream();
ObjectInputStream stream = new ObjectInputStream(inputStream);
User user =(User)stream.readObject();
System.out.println("客户端发过来的数据是:"+user);
} catch (Exception e) {
e.printStackTrace();
}
}
}

Client层
package cn.kgc.sockettest.demo1.demo2; import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.net.Socket; /**
* 客户端
*/ public class Client {
public static void main(String[] args) {
try {
Socket socket = new Socket("localhost",8080);
OutputStream outputStream = socket.getOutputStream();
User user = new User();
user.setUserName("张三");
user.setPassword("admin");
//创建对象输出流
ObjectOutputStream oos = new ObjectOutputStream(outputStream);
//序列化对象
oos.writeObject(user);
//关闭流
oos.close();
socket.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}

Java版SockeDemo案例,有很详细的注释的更多相关文章
- 转:Java多线程学习(总结很详细!!!)
Java多线程学习(总结很详细!!!) 此文只能说是java多线程的一个入门,其实Java里头线程完全可以写一本书了,但是如果最基本的你都学掌握好,又怎么能更上一个台阶呢? 本文主要讲java中多线程 ...
- [转]Java多线程学习(总结很详细!!!)
Java多线程学习(总结很详细!!!) 此文只能说是java多线程的一个入门,其实Java里头线程完全可以写一本书了,但是如果最基本的你都学掌握好,又怎么能更上一个台阶呢? 本文主要讲java中多线程 ...
- 重点|183道Java面试题可以说很详细了
<p style="text-align: right;"><span style="font-size: 14px;color: rgb(136, 1 ...
- java版飞机大战 实战项目详细步骤.md
[toc] 分析 飞机大战 首先对这个游戏分析,在屏幕上的物体都是飞行物,我们可以把建一个类,让其他飞行物继承这个类.游戏中应有英雄机(也就是自己控制的飞机).敌人.而敌人应该分为打死给分的飞机(就是 ...
- Java多线程学习(总结很详细!!!)
https://www.cnblogs.com/yjd_hycf_space/p/7526608.html
- 洛谷 P3384 【模板】树链剖分-树链剖分(点权)(路径节点更新、路径求和、子树节点更新、子树求和)模板-备注结合一下以前写的题目,懒得写很详细的注释
P3384 [模板]树链剖分 题目描述 如题,已知一棵包含N个结点的树(连通且无环),每个节点上包含一个数值,需要支持以下操作: 操作1: 格式: 1 x y z 表示将树从x到y结点最短路径上所有节 ...
- 杭电oj2093题,Java版
杭电2093题,Java版 虽然不难但很麻烦. import java.util.ArrayList; import java.util.Collections; import java.util.L ...
- Qt简单项目--加法计算器(详细代码注释)
Qt的简单案例--加法计算器(详细代码注释) 一.项目结构 二.项目代码 widget.h #ifndef WIDGET_H #define WIDGET_H //预编译指令, 为了避免头文件被重复包 ...
- [转]很详细的devexpress应用案例
很详细的devexpress应用案例,留着以后参考. 注:转载自http://***/zh-CN/App/Feature.aspx?AppId=50021 UPMS(User Permissions ...
随机推荐
- yum源使用报错
CentOS系统yum源使用报错:Error: Cannot retrieve repository metadata (repomd.xml) for repository: rpmforge. 服 ...
- Charles(Windows/Android)入门使用
一. 介绍以及下载(windows) Charles是一个HTTP代理/HTTP监视器/反向代理,使开发人员能够查看其机器和Internet之间所有HTTP和SSL/HTTPS流量,这包括请求,响应和 ...
- 【iOS】edgesForExtendedLayout
在 iOS 7.0 中,苹果引入了一个新的属性,叫做 edgesForExtendedLayou,它的默认值为 UIRectEdgeAll. 当你的容器是 navigationController 时 ...
- 七分钟理解什么是 KMP 算法
本文是介绍 什么是 BF算法.KMP算法.BM算法 三部曲之一. KMP算法 内部涉及到的数学原理与知识太多,本文只会对 KMP算法 的运行过程. 部分匹配表 .next数组 进行介绍,如果理解了这三 ...
- 用泛型写Redis缓存与数据库操作工具类
功能描述: 先从缓存获取数据,如果缓存没有,就从数据库获取数据,并设置到缓存中,返回数据. 如果数据库中没有数据,需要设置一个缓存标记flagKey,防止暴击访问数据库,用缓存保护数据库. 当删除缓存 ...
- 微信公众号接入服务器验证(Go实现)
1 基本流程 将token.timestamp.nonce三个参数进行字典序排序 将三个参数字符串拼接成一个字符串进行sha1加密 开发者获得加密后的字符串可与signature对比,标识该请求来源于 ...
- UEM“探针”技术及用户体验管理
随着互联网产品越来越多,用户群体越来越庞大以及用户品位的多样性增加,我们会发现这样的一个规律,就是相同类型的产品,比如播放器中的QQ影音和暴风影音,再比如小游戏平台中的腾讯游戏和联众等等,他们的功能是 ...
- 5、数组的复制(test2.java、test3.java)
对于数组的复制,在最开始的时候最容易犯的一个错误,那就是自己认为的申请一个数组,然后将已存在的数组赋值到新申请数组名上,这样是错误的,这样仅仅是将数组的地址复制了过去,并不是,将数组内的元素拷贝过去, ...
- 全屏滚动插件pagePiling.js
全屏滚动效果是最近非常流行的网页设计形式,带给用户良好的视觉和交互体验.pagePiling.js 这款 jQuery 插件可以帮助前端开发人员轻松实现这种效果.支持所有的主流浏览器,包括IE8+,支 ...
- golang学习(1)---快速hello world
很多著名的计算机语言都是一两个人在业余时间捣鼓出来的,但是Go语言是由Google的团队打造的.可能一些基础的知识点我不会细讲,因为这个时代你真的得快速学习,才能适应发展. 来看看go的hello, ...