public class Service {  //服务器

    public static void main(String[] args) {
ServerSocket serverSocket=null;
Socket socket=null;
try {
//创建一个超市
serverSocket=new ServerSocket(8800);
while(true){
//超市开门 等待顾客上门购物 怎么保证超市是24消失营业的??
socket = serverSocket.accept();
//使用多线程来实现多个顾客能同时购物 同时结账
ServiceThread thread=new ServiceThread(socket);
thread.start();
}
} catch (IOException e) {
e.printStackTrace();
} } }

服务器端代码

public class ServiceThread extends Thread { 

    //没启动一个线程 就相当于有一个顾客 进入 超市
Socket socket=null; public ServiceThread(Socket socket) {
this.socket=socket;
} @Override
public void run() {
InputStream is=null;
OutputStream os=null;
ObjectInputStream ois=null; //反序列化
try {
//拿出钱包,推上购物车
is=socket.getInputStream();
os=socket.getOutputStream();
//反序列化 获取 顾客的信息
ois=new ObjectInputStream(is);
User user=(User) ois.readObject(); //读到进入超市的顾客信息
if (user!=null) {
System.out.println("服务器说:您的姓名是:"+user.getUserName());
}
//给顾客一个回应
os.write("欢迎您的光临".getBytes());
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}finally{
try {
os.close();
ois.close();
is.close();
} catch (IOException e) {
e.printStackTrace();
} } } }

服务器需要的线程类

public class Client1 {  //第一个顾客

    public static void main(String[] args) {
Socket socket=null;
InputStream is=null;
OutputStream os=null;
ObjectOutputStream oos=null;
//接收服务器的信息 读
BufferedReader br=null; try {
//进入了我们指定的 超市购物
socket=new Socket("localhost", 8800);
is=socket.getInputStream();
os=socket.getOutputStream();
//序列化对象
oos=new ObjectOutputStream(os);
User user=new User("小黑黑1", "admin");
oos.writeObject(user);
//购物完毕 shutdownOutput 与 close
socket.shutdownOutput(); //接收到服务器给你说的 欢迎光临
br=new BufferedReader(new InputStreamReader(is));
String line=null;
while((line=br.readLine())!=null){
System.out.println("我是客户端:服务器 对我说:"+line);
} } catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
br.close();
oos.close();
os.close();
is.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
} } }
}

客户端代码

可是重复 创建多个 客户端的代码  让多个客户端都 启动!  服务器 会接收到每一个客户的信息!

public class Service { // 服务器
public static void main(String[] args) {
DatagramPacket dp = null; //打包 和 拆包数据
DatagramSocket ds = null; // 接收和 发送数据
//创建一个包 给客户端响应
DatagramPacket dpTo=null;
try {
byte [] buf=new byte[1024];
//创建数据包的对象
dp=new DatagramPacket(buf, buf.length);
ds=new DatagramSocket(8800);
//接收
ds.receive(dp);
//显示接收的信息 拆包
String msg=new String(dp.getData(), 0, dp.getLength());
//获取 对方的地址 客户端的信息
System.out.println(dp.getAddress().getHostAddress()+"说====:"+msg); //回复给 客户端
byte[] reply="您好!航母已经发货!".getBytes();
// dp就是从客户端传来的信封 信封上肯定有 寄件人的地址
SocketAddress address=dp.getSocketAddress();
//打包成功
dpTo=new DatagramPacket(reply, reply.length,address);
//发送
ds.send(dpTo);
} catch (SocketException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} } }

基于UDP的客服端代码

public class Client {    //客户端
public static void main(String[] args) {
DatagramPacket dp = null; //打包 和 拆包数据
DatagramSocket ds = null; // 接收和 发送数据
//创建一个包 给服务器响应
DatagramPacket dpTo=null;
InetAddress address=null;
try {
//你在网上购物 要不要给客服 说你的地址
byte[] say="买个航空母舰!".getBytes();
//获取本机的地址!
address = InetAddress.getByName("localhost");
//打包
dp=new DatagramPacket(say, say.length,address,8800);
//发送
ds=new DatagramSocket();
ds.send(dp); //接收
byte [] buf=new byte[1024];
dpTo=new DatagramPacket(buf, buf.length);
ds.receive(dpTo);
//我们看客服给我们回复了 什么 拆包
String reply=new String(dpTo.getData(),0,dpTo.getLength());
System.out.println(dpTo.getAddress().getHostAddress()+"说===》"+reply);
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} } }

基于UDP的顾客端代码

使用多线程完成Socket的更多相关文章

  1. Python拾忆--多线程的socket服务器

    阳光明媚的午后,想想最近要开始从写Java到写Python了,就随手打开电脑来体验一下Python与Java之间的不同吧~ 记得我还在上大二的时候,那个时候才开始学Java,最感兴趣的就是Java书最 ...

  2. C# 实现的多线程异步Socket数据包接收器框架

    转载自Csdn : http://blog.csdn.net/jubao_liang/article/details/4005438 几天前在博问中看到一个C# Socket问题,就想到笔者2004年 ...

  3. 通过编写聊天程序来熟悉python中多线程及socket的用法

    1.引言 Python中提供了丰富的开源库,方便开发者快速就搭建好自己所需要的应用程序.本文通过编写基于tcp/ip协议的通信程序来熟悉python中socket以及多线程的使用. 2.python中 ...

  4. 多线程Java Socket编程示例

    package org.merit.test.socket; import java.io.BufferedReader; import java.io.IOException; import jav ...

  5. 《Unity 3D游戏客户端基础框架》多线程异步 Socket 框架构建

    引言: 之前写过一个 demo 案例大致讲解了 Socket 通信的过程,并和自建的服务器完成连接和简单的数据通信,详细的内容可以查看 Unity3D -- Socket通信(C#).但是在实际项目应 ...

  6. 可扩展多线程异步Socket服务器框架EMTASS 2.0 (转自:http://blog.csdn.net/hulihui)

    可扩展多线程异步Socket服务器框架EMTASS 2.0 (转自:http://blog.csdn.net/hulihui) 0 前言 >>[前言].[第1节].[第2节].[第3节]. ...

  7. 并发编程~~~多线程~~~计算密集型 / IO密集型的效率, 多线程实现socket通信

    一 验证计算密集型 / IO密集型的效率 IO密集型: IO密集型: 单个进程的多线程的并发效率高. 计算密集型: 计算密集型: 多进程的并发并行效率高. 二 多线程实现socket通信 服务器端: ...

  8. 利用多线程使socket服务端可以与多个客户端同时通讯

    利用多线程使socket服务端可以与多个客户端同时通讯 server import socket 1. 符合TCP协议的手机 server = socket.socket(socket.AF_INET ...

  9. day36——死锁、递归锁、信号量、GIL、多线程实现socket通信、线程池和进程池

    day36 死锁现象与递归锁 死锁现象 是指两个或两个以上的进程或线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去.此时称系统处于死锁状态或系统产生了死锁,这 ...

  10. 多线程完成socket

    //服务器端代码 public class Service { //服务器 public static void main(String[] args) { ServerSocket serverSo ...

随机推荐

  1. Java学习----main详解

    public class Test1 { public static void main(String[] args) { System.out.println("Hello"); ...

  2. 高效jQuery

    1.缓存变量 DOM遍历是昂贵的,所以尽量将会重用的元素缓存. // 糟糕 h = $('#element').height(); $('#element').css('height',h-20); ...

  3. winform批量查询单号剔除重复

    //查询分单函数        private string GetQueryInSubbillNo()        {            string strSubbillNO = " ...

  4. python模块之time和datetime

    33.python模块之time      1.>>> time.time() 1470900847.8458395 ==>时间戳,从1970年到现在.      2.> ...

  5. Visual studio code (vscode)

    调东西 : 左上角 File -> Preferences -> Workspace Settings ( User Settings 也可以, 它是 for 所有的 project, W ...

  6. SCALA中的抽象类代码样例

    package com.hengheng.scala class AbstractClass { } abstract class People { def speak val name : Stri ...

  7. RUBY,玩玩~~~

    我觉得吧,这东瀛的红宝石,也得玩玩,毕竟,RUBY ON RAILS,PUPPET等也是一股力量. 作为混IT圈的,知道总没坏处. 就是感觉和C,C++,JAVA,C#,PHP,甚至PYTHON的感觉 ...

  8. ClipDrawable 资源

    ClipDrawable 代表从其他位图上截取的一个“图片片段”. 示例: main.xml <?xml version="1.0" encoding="utf-8 ...

  9. 14.2 InnoDB and the ACID Model

    14.2 InnoDB and the ACID Model ACID 模型是一组数据库设计原则,强调可靠性方面对于商业数据和关键人物. MySQL 包含组件比如InnoDB存储引擎坚持ACID 模型 ...

  10. 【转】(DT系列四)驱动加载中, 如何取得device tree中的属性

    原文网址:http://www.cnblogs.com/biglucky/p/4057488.html 本文以At91rm9200平台为例,从源码实现的角度来分析驱动加载时,Device tree的属 ...