文档章节

Java 的 Socket(套接字)编程简易教程

最爱肉肉
 最爱肉肉
发布于 2016/10/04 21:32
字数 910
阅读 16
收藏 0
点赞 0
评论 0

首先写一个ServerSocket(服务器端的监听类)用于监听Socket连接,每新产生一个对话,都交由Socket的实例去处理.

package com.pan.socket.service;

import javax.net.ServerSocketFactory;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * Created by pan on 2016/10/4.
 */
public class MyServer extends Thread {

    public void run() {
        try {
            //创建serverSocket,并绑定端口.
            ServerSocket serverSocket = ServerSocketFactory.getDefault().createServerSocket(2354);
            System.out.println("服务启动成功,正在监听端口2354");
            //接受客户端请求
            while (true) {
                Socket accept = serverSocket.accept();
                //每新增一个对话,交给一个Socket的实例去处理
                new MySocket(accept).start();
                System.out.println("客户端已经连接...");
            }

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

然后,编写Socket服务端实例,用于与客户端的通信

package com.pan.socket.service;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;

/**
 * Created by pan on 2016/10/4.
 */
public class MySocket extends Thread {
    private Socket socket;

    //实例化传入socket对象
    public MySocket(Socket socket) {
        this.socket = socket;
    }


    public void run() {
        //像客户端输出提示信息
        write("已经连接..");
        //读取客户端的输入
        reader();
    }

    /**
     * 读取客户端输入的数据
     */
    private void reader() {
        try {
            //接受客户端数据
            BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream(), "UTF-8"), MAX_PRIORITY);
            String line;
            //循环读取客户端的数据
            while ((line = reader.readLine()) != null) {
                //退出指令
                if (!line.equalsIgnoreCase("exit")) {
                    System.out.println("客户端输入:" + line);
                    //向客户端写入
                    write(line);
                } else {
                    write("正在退出...");
                    System.out.println("一个客户端退出");
                    break;
                }
            }
            //关闭流
            reader.close();
        } catch (IOException e) {
            System.out.println("失去响应");
        }
    }

    /**
     * 向客户端写入数据
     */
    void write(String str) {
        try {
            socket.getOutputStream().write((str + "\n").getBytes("UTF-8"));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

然后是启动服务端的类,用于启动服务.

package com.pan.socket.service;

/**
 * Created by pan on 2016/10/4.
 */
public class Main {

    public static void main(String[] args) {
        new MyServer().start();
    }

}

第二部分:客户端代码

客户端首先需要新建一个类,用于连接服务端.并接受服务端信息,以及向服务端发送消息.客户端不需要监听Socket,所以相比于服务端要少一个监听的类.

连接服务端并执行信息处理类

package com.pan.socket.client;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
import java.util.Scanner;

/**
 * Created by pan on 2016/10/4.
 */
public class ClientSocket extends Thread {
    private Socket socket;

    public void run() {
        try {
            socket = new Socket("127.0.0.1", 2354);
            new Thread() {
                public void run() {
                    //接受用户输入
                    Scanner scanner = new Scanner(System.in);
                    String inStr;
                    while ((inStr = scanner.nextLine()) != null) {
                        write(inStr);
                        //退出指令
                        if (inStr.equalsIgnoreCase("exit")) {
                            System.out.println("客户端退出");
                            break;
                        }
                    }
                    //输入流关闭
                    scanner.close();
                }
            }.start();
            //读取服务端消息
            reader();

        } catch (IOException e) {
            System.out.println("连接失败");
        }
    }

    /**
     * 读取服务端数据
     */
    private void reader() {
        try {
            //接受客户端数据
            BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream(), "UTF-8"), MAX_PRIORITY);
            String line;
            //循环读取服务端的数据
            while ((line = reader.readLine()) != null) {
                System.out.println("服务端:" + line);
            }
            //关闭流
            reader.close();
        } catch (IOException e) {
            System.out.println("失去响应");
        }
    }

    /**
     * 向服务端些数据
     */
    void write(String str) {
        try {
            socket.getOutputStream().write((str + "\n").getBytes("UTF-8"));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }


}

ps:这里采用控制台输入,因为两个死循环,所以采用new Thread(){} ;新建一个线程去处理循环监听控制台输入,主线程循环监听服务端数据.

2.启动客户端类

package com.pan.socket.client;

/**
 * Created by pan on 2016/10/4.
 */
public class Main {

    public static void main(String[] args) {
        new ClientSocket().start();
    }
}

3.测试:

启动服务端,然后在启动客户端,输入一些数据.

4.结果

服务端:

服务启动成功,正在监听端口2354
客户端已经连接...
客户端输入:88
客户端输入:萨大幅
客户端输入:sa
一个客户端退出

客户端:

服务端:已经连接..
88
服务端:88
萨大幅
服务端:萨大幅
sa
服务端:sa
exit
客户端退出
服务端:正在退出...

Process finished with exit code 0

 

题外:

    如果需要通知功能,那么服务端添加一个用于管理MySocket的类,在该类下来实现MySocket对象的存储,以及遍历实现通知功能.

 

© 著作权归作者所有

共有 人打赏支持
最爱肉肉
粉丝 3
博文 51
码字总数 34967
作品 0
深圳
程序员
eclipse远程debug,java项目

首先java项目要支付可远程调试得到启动时加入参数 启动远程调试 启用JMX,远程性能观察 eclipse配置 其中:host为远程java程序提供远程调试的IP,post为远程java程序提供远程调试的端口 使用 ...

有事没事
2014/12/05
0
0
java socket编程实例代码讲解

1、所谓socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄。应用程序通常通过"套接字"向网络发出请求或者应答网络请求。 操作java socket时用到的最多的三个方法为: ac...

不成熟的男人
2015/08/03
0
0
java基础专栏—java网络编程

java网络编程 在网络成层中TCP对应于四层 通常是对网络连接设备的驱动协议,例如对光纤和都对网线的驱动不一样 TCP/IP协议的核心,他用于将数据分组 包括TCP,UDP 主要是负责应用程序的协议。...

T-newcomer
2017/10/25
0
0
12.5-全栈Java笔记:Java网络编程(三)

上节回顾:在学习了Socket在建立客户端和服务器单项通讯中,分别创建独立的Socket,并通过Socket的属性。 那么如何将两个Socket进行连接,从而达到客户端和服务器之间建立输入输出流进行通信...

全栈Java
06/26
0
0
Java NIO 机制分析(一) Java IO的演进

一、引言 Java1.4之前的早期版本,Java对I/O的支持并不完善,开发人员再开发高性能I/O程序的时候,会面临一些巨大的挑战和困难,主要有以下一些问题: (1)没有数据缓冲区,I/O性能存在问题...

宸明
04/20
0
0
select,iocp,epoll,kqueue及各种I/O复用机制

首先,介绍几种常见的I/O模型及其区别,如下: blocking I/O nonblocking I/O I/O multiplexing (select and poll) signal driven I/O (SIGIO) asynchronous I/O (the POSIX aio_functions)......

大道至簡
2014/08/04
0
1
Java NIO_Socket

Java NIO_Socket SocketChannel Java NIO中的SocketChannel是一个连接到TCP网络套接字的通道。可以通过以下2种方式创建SocketChannel: 打开一个SocketChannel并连接到互联网上的某台服务器。...

秋风醉了
2014/05/02
0
0
java.net.SocketException: socket closed

在使用socket编程的时候,发现当使用完getInputStream方法后,再获取OutputStream就会报 java.net.SocketException: socket closed错误 看到JAVA api中写到 java.net.Socket.getInputStream...

jiangmitiao
2015/08/13
0
0
android连网详解——android.net、org.apache.http联网实现

1.连网相关包介绍 今天我们将深入介绍了Android SDK 中一些与网络有关的package,如下: 包描述 java.net 提供与联网有关的类,包括流和数据包(datagram)sockets、Internet 协议和常见 HT...

JavaGG
2011/05/03
0
0
再谈select, iocp, epoll,kqueue及各种I/O复用机制

首先,介绍几种常见的I/O模型及其区别,如下: blocking I/O nonblocking I/O I/O multiplexing (select and poll) signal driven I/O (SIGIO) asynchronous I/O (the POSIX aio_functions)......

开心303
2012/02/09
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

微信分享的细节

分享的缩略图要求: 一、图片大小小于32k 二、图片的尺寸为 宽度 :128px 高度:128px 分享title 和 description 出现金额等 以上情况存在会导致触发分享按钮 但是页面没有反应...

Js_Mei
3分钟前
0
0
【2018.07.23学习笔记】【linux高级知识 Shell脚本编程练习】

1、编写shell脚本,计算1-100的和; #!/bin/bashsum=0for i in `seq 1 100`do sum=$[$sum+$i]doneecho $sum 2、编写shell脚本,要求输入一个数字,然后计算出从1到输入数字的和,要求...

lgsxp
5分钟前
0
0
xss攻防浅谈

导读 XSS (Cross-Site Script) 攻击又叫跨站脚本攻击, 本质是一种注入攻击. 其原理, 简单的说就是利用各种手段把恶意代码添加到网页中, 并让受害者执行这段脚本. XSS能做用户使用浏览器能做的...

吴伟祥
5分钟前
0
0
js回调的一次应用

function hideBtn(option) { if (option == 1) { $("#addBtn").hide(); $("#addSonBtn").hide(); }}$("body").on("click", "#selectBtn", function () {......

晨猫
12分钟前
0
0
C++_读写ini配置文件

1.WritePrivateProfileString:

一个小妞
12分钟前
0
0
通往阿里,BAT的50+经典Java面试题及答案解析(上)

Java是一个支持并发、基于类和面向对象的计算机编程语言。下面列出了面向对象软件开发的优点: 代码开发模块化,更易维护和修改。 代码复用。 增强代码的可靠性和灵活性。 增加代码的可理解性...

Java大蜗牛
12分钟前
0
0
数据库两大神器【索引和锁】

前言 只有光头才能变强 索引和锁在数据库中可以说是非常重要的知识点了,在面试中也会经常会被问到的。 本文力求简单讲清每个知识点,希望大家看完能有所收获 声明:如果没有说明具体的数据库...

Java3y
16分钟前
0
0
Application Express安装

Application Express安装文档 数据库选择和安装 数据库选择 Oracle建议直接12.2.0.1.0及以上的版本,12.1存在20618595bug(具体可参见官方文档) Oracle 12c 中安装oracle application expr...

youfen
28分钟前
0
0
OpenMessaging概览

序 本文主要研究一下OpenMessaging 架构图 namespace,类似cgroup的namespace,用来进行安全隔离,每个namespace有自己的producer、consumer、topic、queue等 producer,消息生产者有两类,一...

go4it
33分钟前
0
0
MySQL索引类型

MySQL目前主要有以下几种索引类型: 1.普通索引 2.唯一索引 3.主键索引 4.组合索引 5.全文索引 https://www.cnblogs.com/luyucheng/p/6289714.html...

灯下草虫鸣_
34分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部