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

直接上代码(一)

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. shiro 和 spring boot 的集成

    1 添加依赖 使用 shiro-spring-boot-web-starter 在 spring boot 中集成 shiro 只需要再添加一个依赖 <dependency> <gr ...

  2. React Hooks 深入系列 —— 设计模式

    本文是 React Hooks 深入系列的后续.此篇详细介绍了 Hooks 相对 class 的优势所在, 并介绍了相关 api 的设计思想, 同时对 Hooks 如何对齐 class 的生命周期钩子 ...

  3. c#小灶——初识c#

    提到c#,就不得不说.net,.net是微软开发的一个平台,简单来说,在这个平台上,可以编写.运行程序.可能很多人觉得这个平台离我们很遥远,其实不然,这个平台就一直在我们的windows操作系统里,默 ...

  4. java流压缩图片

    整理文档,搜刮出一个Java做图片压缩的代码,稍微整理精简一下做下分享.首先,要压缩的图片格式不能说动态图片,你可以使用bmp.png.gif等,至于压缩质量,可以通过BufferedImage来指定 ...

  5. Svn提交冲突问题

    MEclipse中的svn冲突解决办法: 1.        点击提交,报错——‘SVN提交’has encountered a problem. 2.        选中无法提交的文件,点击更新操作 ...

  6. spring实战学习笔记(一)spring装配bean

    最近在学习spring boot 发现对某些注解不是很深入的了解.看技术书给出的实例 会很疑惑为什么要用这个注解? 这个注解的作用?有其他相同作用的注解吗?这个注解的运行机制是什么?等等 spring ...

  7. MySQL操作命令梳理(1)

    一.索引 1.创建索引 索引的创建可以在CREATE TABLE语句中进行,也可以单独用CREATE INDEX或ALTER TABLE来给表增加索引.以下命令语句分别展示了如何创建主键索引(PRIM ...

  8. 十分钟带你看一遍ES6新特性

    let , const关键字 var 看习惯了java, 看js真的是忍不住想笑,比如说这个var,它太自由了,自由到{}根本限制不住它的生命周期 js的var关键字,无论在何处声明,都会被视为声明在 ...

  9. Python基础编程 内置函数

    内置函数 内置函数(一定记住并且精通) print()屏幕输出 int():pass str():pass bool():pass set(): pass list() 将一个可迭代对象转换成列表 t ...

  10. 佳木斯集训Day5

    今天是ACM赛制...本来可以400的,结果毒瘤T2模拟硬生生卡掉了我90分 T1是个大水题,找规律,5分钟AC没啥压力 #include <bits/stdc++.h> #define ...