一个例子看懂socket

一个服务端与多个客户端交互的例子

package j2se.socket;

import java.io.*;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * Created by jingqing.zhou on 2015/6/17.
 * 基于tcp协议的socket通信,实现用户登录
 * 服务器端
 */
public class server {
    public static void main(String[] args) {
        //1.创建一个服务器端socket
        try {
            ServerSocket sst =  new ServerSocket(8999);
            System.out.println("服务器即将启动,等待客户端的链接=====>");
            //记录客户端的数量
            int count = 0 ;
            while (true){
                Socket socket = sst.accept();//阻塞,等待客户端请求
                //创建一个新的线程
                ServerThread serverThread = new ServerThread(socket);
                //启动线程
                serverThread.start();
                count ++ ;
                System.out.println("当前客户连接数"+count);
                InetAddress address = socket.getInetAddress();
                System.out.println("当前客户端的ip地址:"+address.getHostAddress());

            }

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
package j2se.socket;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * Created by jingqing.zhou on 2015/6/17.
 * 基于tcp协议的socket通信,实现用户登录
 * 服务器端线程处理类
 */
public class ServerThread  extends Thread{
    //和本线程相关的socket
    Socket socket = null ;
    public ServerThread(Socket socket){
        this.socket = socket;
    }
    //线程的执行操作,响应客户端的请求
    public void run(){
        //获取输入流,并读取客户端信息
        InputStream is =null;
        InputStreamReader isr=null ;
        BufferedReader bufferedReader =null ;
        OutputStream os=null ;
        PrintWriter pw=null ;
        try {

             is = socket.getInputStream();//字节输入流
             isr = new InputStreamReader(is);//将字节流包装为字符流
             bufferedReader = new BufferedReader(isr);//为输入流添加缓冲

            String info = null;
            //循环读取客户端信息
            while ((info = bufferedReader.readLine()) != null) {
                System.out.println("我是服务器,客户端说:" + info);
            }
            socket.shutdownInput();//关闭输入流

            //获取输出流,用于响应客户端请求
             os = socket.getOutputStream();
             pw = new PrintWriter(os);//将输出流包装为打印流
            pw.write("欢迎您:admin!!");
            pw.flush();
        }catch (IOException e){
            e.printStackTrace();
        }finally {

        //关闭资源
            try{
                bufferedReader.close();
                pw.close();
                os.close();
                isr.close();
                is.close();
                socket.close();
            }catch (IOException e){
                e.printStackTrace();
            }
        }

    }
}
package j2se.socket;

import java.io.*;
import java.net.Socket;

/**
 * Created by jingqing.zhou on 2015/6/17.
 */
public class client {
    public static void main(String[] args) {
        try {
            //创建客户端socket,指定服务器地址和端口
            Socket socket = new Socket("localhost",8999);
            //获取输出流,用来向服务器端发送信息
            OutputStream os = socket.getOutputStream();
            PrintWriter pw = new PrintWriter(os);//将输出流包装为打印流
            pw.write("用户名:admin1111;密码:123");
            pw.flush();
            socket.shutdownOutput();//关闭输出流
            //获取输入流,并读取服务器端的响应信息
            InputStream is = socket.getInputStream();
            BufferedReader br = new BufferedReader(new InputStreamReader(is));
            String info = null ;
            //循环读取服务器端信息
            while ((info = br.readLine())!=null){
                System.out.printf("我是客户端,服务器端说:"+ info);
            }
            socket.shutdownInput();//关闭输入流
            br.close();
            is.close();
            pw.close();
            os.close();
            socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
时间: 2024-10-12 16:47:27

一个例子看懂socket的相关文章

一个例子看懂神马是闭包

闭包就是这个玩意儿.怎么用在此不做多讲.就告诉大家闭包长神马样子. <!DOCTYPE html> <html> <head> <title>神马JS闭包</title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <script> function wenyi(){ var i=0; ret

一个例子看懂异步代码执行效率

异步代码采用线程池,提供代码执行的并行性,不阻塞当前线程,实例代码,模拟三个耗时操作,分别耗时为1000.1500.1800ms,提供同步与异步的实现方式,Main中以同步异步的方式执行,对比执行时间,同步执行方式为各个方法的执行时间总和,而异步执行方式为最长的那个时间.ps:实际执行情况可能有其他的一些微不足道开销,但大体能反应异步的执行效率. class OutHelper { public DateTime Method1() { Thread.Sleep(1000); return Da

一个例子看懂C语言中的++号的用法

话不多说,直接上代码: #include<stdio.h> int main(){ int suzu [10] ={10,11,12,13},i; int *p=suzu; //打印出所有的数据 for(i=0;i<10;i++) printf("%d\n",suzu[i]); //因为*的优先级高于+号 所以这个括号是必须要的 printf("\n"); //因为这个不是按照指针来读取的,所以我们会从默认第一位开始读取 for(i=0;i<

用一个例子读懂 RequireJS

用一个例子读懂 RequireJS 例子来自官方,我稍微改造了一下,如下: // project.html <!DOCTYPE html> <html>     <head>         <title>requirejs</title>         <!-- data-main attribute tells require.js to load              scripts/main.js after require.

关于类、方法、对象(实例):通过一个例子看一下self都做了哪些事情

我们在定义一个类时,经常会在类的各个方法中看到self,那么在程序执行时self到底起了什么作用,什么时候要加self,这一点需要我们思考并好好理解.之前在学习时没有想这么多,加之用pycharm写代码,很多地方都自动补全了,有些地方没加self,会提示错误,然后补全,没有想过这个过程,今天刚好整理一下. 1.先简单说明一下self的含义 类的方法与普通的函数只有一个特别的区别 -- 它们必须有一个额外的第一个参数名称,但是在调用这个方法的时候你不为这个参数赋值, Python 会提供这个值.这

走近比特币:一个故事看懂“区块链”

区块链是比特币的底层技术和基础架构,本质上是一个去中心化的数据库.区块链是一串使用密码学方法相关联产生的数据块,每一个数据块中包含了一次比特币网络交易的信息,用于验证其信息的有效性(防伪)并生成下一个区块. 狭义来讲,区块链是一种按照时间顺序将数据区块以顺序相连的方式组合成的一 种链式数据结构, 并以密码学方式保证的不可篡改和不可伪造的分布式账本. 以上定义摘自百度百科.很多菜鸟朋友看完这段解释依然满脸懵逼,到底什么是“区块链”? 起因 除非你完全没有接触过信息安全,否则一定听说过比特币和区块链

一个例子读懂 JS 异步编程: Callback / Promise / Generator / Async

JS异步编程实践理解 回顾JS异步编程方法的发展,主要有以下几种方式: Callback Promise Generator Async 需求 显示购物车商品列表的页面,用户可以勾选想要删除商品(单选或多选),点击确认删除按钮后,将已勾选的商品清除购物车,页面显示剩余商品. 为了便于本文内容阐述,假设后端没有提供一个批量删除商品的接口,所以对用户选择的商品列表,需要逐个调用删除接口. 用一个定时器代表一次接口请求.那思路就是遍历存放用户已选择商品的id数组,逐个发起删除请求del,待全部删除完成

一个例子看清楚JQuery子元素选择器children()和find()的区别

最近在我们的hybrid app项目开发中定位出了一个问题,通过这个问题了解下JQuery选择器find()和children()的区别.问题是这样的:我们的混合app是一个单页面应用(main.html),逻辑上的页面是通过项目自定义的.mspl文件(其实就是html文件)来呈现的.比如a.mspl.b.mspl.c.mspl加载的时候,都会插入到main.html中,但是每次只显示1个mspl文件,当b.mspl显示的时候,a.mspl和c.mspl就会被隐藏.在a.b.c这3 个页面上都会

一个例子搞懂C++的虚函数和纯虚函数

转自https://blog.csdn.net/vincent040/article/details/78848322,并对代码做了小幅修正,在此感谢原作者. 学习C++的多态性,你必然听过虚函数的概念,你必然知道有关她的种种语法,但你未必了解她为什么要那样做,未必了解她种种行为背后的所思所想.深知你不想在流于表面语法上的蜻蜓点水似是而非,今天我们就一起来揭开挡在你和虚函数(女神)之间的这一层窗户纸. 首先,我们要搞清楚女神的所作所为,即语法规范.然后再去探究她背后的逻辑道理.她的语法说来也不复