一般是用一个线程池来处理接受到的请求

直接上代码(一)

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案例,有很详细的注释的更多相关文章

  1. 转:Java多线程学习(总结很详细!!!)

    Java多线程学习(总结很详细!!!) 此文只能说是java多线程的一个入门,其实Java里头线程完全可以写一本书了,但是如果最基本的你都学掌握好,又怎么能更上一个台阶呢? 本文主要讲java中多线程 ...

  2. [转]Java多线程学习(总结很详细!!!)

    Java多线程学习(总结很详细!!!) 此文只能说是java多线程的一个入门,其实Java里头线程完全可以写一本书了,但是如果最基本的你都学掌握好,又怎么能更上一个台阶呢? 本文主要讲java中多线程 ...

  3. 重点|183道Java面试题可以说很详细了

    <p style="text-align: right;"><span style="font-size: 14px;color: rgb(136, 1 ...

  4. java版飞机大战 实战项目详细步骤.md

    [toc] 分析 飞机大战 首先对这个游戏分析,在屏幕上的物体都是飞行物,我们可以把建一个类,让其他飞行物继承这个类.游戏中应有英雄机(也就是自己控制的飞机).敌人.而敌人应该分为打死给分的飞机(就是 ...

  5. Java多线程学习(总结很详细!!!)

    https://www.cnblogs.com/yjd_hycf_space/p/7526608.html

  6. 洛谷 P3384 【模板】树链剖分-树链剖分(点权)(路径节点更新、路径求和、子树节点更新、子树求和)模板-备注结合一下以前写的题目,懒得写很详细的注释

    P3384 [模板]树链剖分 题目描述 如题,已知一棵包含N个结点的树(连通且无环),每个节点上包含一个数值,需要支持以下操作: 操作1: 格式: 1 x y z 表示将树从x到y结点最短路径上所有节 ...

  7. 杭电oj2093题,Java版

    杭电2093题,Java版 虽然不难但很麻烦. import java.util.ArrayList; import java.util.Collections; import java.util.L ...

  8. Qt简单项目--加法计算器(详细代码注释)

    Qt的简单案例--加法计算器(详细代码注释) 一.项目结构 二.项目代码 widget.h #ifndef WIDGET_H #define WIDGET_H //预编译指令, 为了避免头文件被重复包 ...

  9. [转]很详细的devexpress应用案例

    很详细的devexpress应用案例,留着以后参考. 注:转载自http://***/zh-CN/App/Feature.aspx?AppId=50021 UPMS(User Permissions ...

随机推荐

  1. go mod 无法自动下载依赖包的问题

    go 11以后启用了go mod功能,用于管理依赖包. 当执行go mod init生成go.mod文件之后,golang在运行.编译项目的时候,都会检查依赖并下载依赖包. 在启动了go mod之后, ...

  2. 【JDK】JDK源码分析-HashMap(1)

    概述 HashMap 是 Java 开发中最常用的容器类之一,也是面试的常客.它其实就是前文「数据结构与算法笔记(二)」中「散列表」的实现,处理散列冲突用的是“链表法”,并且在 JDK 1.8 做了优 ...

  3. 【Android】ViewModel+LiveData:更加直接地控制视图的方式

    目录 LiveData 前言 使用ViewModel+LiveData LiveData 前言   ViewModel通过将UI data保存在ViewModel类实例的内部,从而大大地将MVC中的 ...

  4. rocksdb编译步骤——Java、Golang、mac

    如果不是必要不建议自己编译rocksdb,编译的过程比较耗时费力.现在已经有很多编译好的文件可供使用. Java <!-- https://mvnrepository.com/artifact/ ...

  5. Python基础总结之初步认识---class类的继承(下)。第十五天开始(新手可相互督促

    年薪百万的步伐慢了两天hhhh严格意义是三天.最近买了新的玩具,在家玩玩玩!~~~~ 今天开始正式认识类的继承.类的继承是怎么继承呢?看下代码: class Animal(object): #父类 d ...

  6. [转] java开源游戏

    收藏一下   triplea  Triplea是一个开放源码的boardgame.它允许玩家选择各种各样的战略版图游戏(如:轴心国或同盟军).TripleA引擎支持联网对战,支持声音,支持使用XML文 ...

  7. Mysql 局域网连接设置——Windows

    在公司工作中,会遇到mysql数据库存储于某个人的电脑上,大家要想连接mysql服务,装有mysql服务的电脑就必须开启远程连接. 其实不仅仅是局域网,只要你有数据库所在服务器的公网IP地址都能连上. ...

  8. springboot集成redis实现消息发布订阅模式-双通道(跨多服务器)

    基础配置参考https://blog.csdn.net/llll234/article/details/80966952 查看了基础配置那么会遇到一下几个问题: 1.实际应用中可能会订阅多个通道,而一 ...

  9. 【I'm Telling the Truth】【HDU - 3729】 【匈牙利算法,DFS】

    思路 题意:该题主要说几个同学分别说出自己的名次所处区间,最后输出可能存在的未说谎的人数及对应的学生编号,而且要求字典序最大. 思路:刚刚接触匈牙利算法,了解的还不太清楚,附一个专门讲解匈牙利算法的博 ...

  10. 5 X 5 方阵引出的寻路算法 之 路径遍历(完结)

      此篇文章源自对一个有趣问题的思考,在我的另一篇博文<一个有趣的 5 X 5 方阵一笔画问题>中有详细介绍.在已知其结论的情况下,作为程序员的我,还是想利用该问题当做出发点,写一个可以遍 ...