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

直接上代码(一)

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. CSS和html如何结合起来——选择符及优先级

       1.选择符     兼容性 统配选择符 *         元素选择符 body   类选择符 .class   id选择符 #id         包含原则符 p strong     (所有 ...

  2. web设计_7_页面缺失图片或CSS的情况下仍然易读

    1. 在任何可能使用背景图片的地方应设置同样的颜色的背景色. 防止图片不能加载的情况下,页面内容同样保持较好可读性. 例如文字为白色,背景图为深色,如果不设置背景色,当背景图未成功加载, 而浏览器多数 ...

  3. jdk1.8HashMap底层数据结构:散列表+链表+红黑树,jdk1.8HashMap数据结构图解+源码说明

    一.前言 本文由jdk1.8源码整理而得,附自制jdk1.8底层数据结构图,并截取部分源码加以说明结构关系. 二.jdk1.8 HashMap底层数据结构图 三.源码 1.散列表(Hash table ...

  4. nginx 301跳转https后post请求失效问题解决

    app本地请求是http端口,后来升级https强制301跳转,设置如下 server { listen 80; server name www.XXX.com; rewrite ^/(.*)$ ht ...

  5. win10应用商店卸载后重装教程

    方法一 先进这个链接   http://go.microsoft.com/fwlink/?LinkId=619547  下载一个记事本文件,并且把它保存到你的“下载” 里面. 管理员身份打开Power ...

  6. .net core 实现基于 cron 表达式的任务调度

    .net core 实现基于 cron 表达式的任务调度 Intro 上次我们实现了一个简单的基于 Timer 的定时任务,详细信息可以看这篇文章. 但是使用过程中慢慢发现这种方式可能并不太合适,有些 ...

  7. HTML第六章 盒子模型

    什么是盒子模型: (1)边框: (2)内边距: (3)外边距: (4)元素内容·: (5)背景色·: 边框: 属性: 颜色(border-color),粗细(border-width),样式(bord ...

  8. CodeGlance右侧窗口缩略图消失不见

    说明下问题,idea中的CodeGlance插件会在右侧显示缩略图,可以快速定位代码.今天遇到个问题升级了插件后右侧窗口消失.经过卸载插件,重启,reset一系列操作后还是没能恢复. 能去搜索引擎搜索 ...

  9. Leetcode solution 227: Basic Calculator II

    Problem Statement Implement a basic calculator to evaluate a simple expression string. The expressio ...

  10. Kafka集群模式安装(二)

    我们来安装Kafka的集群模式,三台机器: 192.168.131.128 192.168.131.130 192.168.131.131 Kafka集群需要依赖zookeeper,所以需要先安装好z ...