第一次接触Socket课程设计大二,我在做一个图书馆管理系统。源代码是从互联网上下载,代码天天磨,隐约中记得有Socket这么一个单词。

第二次是去年代表学校參加“河北省电子信息职业技能大赛”,接受曹建新师哥的培训。建新师哥当时用手机Android软件做client。通过局域网向电脑端server传输手机录入的信息。当时我非常诧异,client是Android平台,server是.Net平台,这两种平台是怎样在局域网内进行通信的呢?建新师哥的回答是:“通过Socket。把数据打包成JSON格式进行传输。”从此对Socket的认识便有了一种高大上的感觉。

第三次接触是通过马士兵老师的视频,这次瞬间感觉Socket--So Easy。这也验证了米老师的那句话:不怕不知道,就怕不知道。

Socket通信分为serverSocket即ServerSocket和clientSocket。

在server端,通信前须要建立和client的通信通道,建立对client通信port号的监听;在client,通信前须要定义进行通信的主机IP和port号,创建通信通道。两者都准备完成,以下就能够进行通信了。

server端代码:

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket; public class TCPServer { public static void main(String[] args) {
//创建向client数据传输的通道
InputStream in = null;
//创建从client接收数据的通道
OutputStream out = null; try {
//建立和client的通信,并定义通信端口
ServerSocket ss = new ServerSocket(5888);
//监听client提交的请求
Socket socket = ss.accept();
in = socket.getInputStream();
out = socket.getOutputStream();
//在字节流的基础上进行包装数据流
DataInputStream dis = new DataInputStream(in);
DataOutputStream dos = new DataOutputStream(out); //接收client提交的请求
String s = null;
if ((s = dis.readUTF()) != null) {
System.out.println(s);
System.out.println("from:" + socket.getInetAddress());
System.out.println("port:" + socket.getPort());
} //向client数据传输
dos.writeUTF("hi,hello");
dos.close();
dis.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}

因为数据流的readUTF()方法和writeUTF()方法都是堵塞式,所以当A向B发送数据后。假设B没有响应。A是无法继续发送数据的,仅仅能傻傻的等待。这个过程好比TCP/IP协议的三次握手,1:A呼叫B,“我是A。收到请回答?”;2:B回应A,“我是B,收到”;3:A继续说。“我想请你吃饭,你有时间吗?”。以下A和B就能够进行通信了。

server端代码有了,以下分享client代码:

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException; public class TCPClient {
public static void main(String[] args) {
//创建向server数据传输的通道
InputStream in = null;
//创建从server接收数据的通道
OutputStream out = null;
try {
//定义进行通信的主机IP和端口号
Socket socket = new Socket("localhost", 5888);
in = socket.getInputStream();
out = socket.getOutputStream();
//在字节流的基础上进行包装数据流
DataInputStream dis = new DataInputStream(in);
DataOutputStream dos = new DataOutputStream(out);
//向server提交数据
dos.writeUTF("hey");
//接收从server返回的数据
String s = null;
if ((s = dis.readUTF()) != null) {
System.out.println(s);
}
dos.close();
dis.close();
socket.close();
} catch (UnknownHostException e) {
e.printStackTrace();
}catch(IOException e){
e.printStackTrace();
}
}
}

通过这个简单的小Demo,我们就能够清晰的观察到Socket是怎样在server端和client进行通信的。

J2SE是JavaWeb和J2EE的基础,异常处理、IO通道、线程、网络编程、GUI编程又是J2SE的基础,所以学好Socket非常有必要。

席慕蓉说过一句名言:前世的五百次回眸才干换得今生的一次擦肩而过。所以对于以后的每次擦肩而过都应该认真对待。不要像我。和Socket都擦肩而过好多次了,今天才最终认识它。

版权声明:本文博客原创文章,博客,未经同意,不得转载。

j2se--Socket沟通的更多相关文章

  1. 使用Socket沟通

    当两台电脑TCP/IP协议进行通讯.平时Socket对象来表示该通信接口的两端,并通过Socket生产I/O流进行网络通信. 其中ServerSocket对象可以接收从连接的其他通信实体的请求.这个目 ...

  2. nginx反向代理docker容器化django

    1.新建Dockerfile FROM python:3.8.5 MAINTAINER ChsterChen ENV PYTHONUNBUFFERED 1 COPY pip.conf /root/.p ...

  3. 一起学 Java(四) File、Try 、序列化、MySQL、Socket

    一.Java 流(Stream).文件(File)和IO Java.io 包几乎包含了所有操作输入.输出需要的类.所有这些流类代表了输入源和输出目标. Java.io 包中的流支持很多种格式,比如:基 ...

  4. Java Socket 编程

    1. 背景 网络编程是指编写运行在多个设备(计算机)的程序,这些设备都通过网络连接起来. java.net 包中 J2SE 的 API 包含有类和接口,它们提供低层次的通信细节.你可以直接使用这些类和 ...

  5. 随笔 -- IO -- Socket/ServerSocket -- 系统概述

    随笔 -- IO -- Socket/ServerSocket -- Echo(BIO)实例 Java 网络编程 网络编程是指编写运行在多个设备(计算机)的程序,这些设备都通过网络连接起来. java ...

  6. 从零开始学Python第八周:网络编程基础(socket)

    Socket网络编程 一,Socket编程 (1)Socket方法介绍 Socket是网络编程的一个抽象概念.通常我们用一个Socket表示"打开了一个网络链接",而打开一个Soc ...

  7. Java Socket编程

    Java最初是作为网络编程语言出现的,其对网络提供了高度的支持,使得客户端和服务器的沟通变成了现实,而在网络编程中,使用最多的就是Socket.像大家熟悉的QQ.MSN都使用了Socket相关的技术. ...

  8. IOS Socket 01-网络协议基础知识

    1. 网络参考模型 OSI参考模型                                          TCP/IP参考模型 2. 七层简述 1)物理层:主要定义物理设备标准,如网线的接 ...

  9. Socket开发框架之框架设计及分析

    虽然在APP应用.Web应用.Winform应用等大趋势下,越来越多的企业趋向于这些应用系统开发,但是Socket的应用在某些场合是很必要的,如一些停车场终端设备的接入,农业或者水利.压力监测方面的设 ...

  10. Linux IPC tcp/ip socket 编程

    模型 #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include < ...

随机推荐

  1. Linux命令对应的全称解释(转)

    Filesystem Hierarchy Standard(FHS) /:根目录,所有的目录.文件.设备都在/之下,/就是Linux文件系统的组织者,也是最上级的领导者.  /bin:bin 就是二进 ...

  2. sql语句中单引号嵌套问题

    在sql语句中,我们难免会用到单引号嵌套的时候,但是直接嵌套肯定是不行的,java中用反斜杠做转义符也是不行的,在sql中是用单引号来做转义符的. 比如下面例子是存储过程里查询时的语句示例 exec ...

  3. 边记边学PHP-(十五)MySQL数据库基础操作2

    四.使用可视化工具创建数据库 尽管使用命令行感觉更像我们程序猿,可是我还是比較喜欢使用workbench来创建数据库. 首先打开workbench , 一个比較友好的界面就打开了,哈哈.我还是比較喜欢 ...

  4. 【原创】用Python爬取LeetCode的AC代码到Github

    在leetCode写了105道题高调膜科,考虑搬迁到自己的GitHub上,做成一个解题题库,面试的时候也可以秀一个 但是!但是! leetCode在线IDE的功能不要太舒服,我直接线上A了不少题,本地 ...

  5. style.display table-row与block

    <tr id="js_rowShow" style=" display:none"> </tr> 问题: display:设置成bloc ...

  6. Oracle 工艺结构

    Oracle工艺结构 这个过程是动态创建,完毕任务后就消亡:而程序是静态的实体,程序是能够复制.编辑的.进程强调的是运行过程,而程序不过指令的有序集合:进程在内存中,程序在外存中. ORACLE分为用 ...

  7. PHP如何添加内置的扩展

    什么时候server上PHP已安装.需要额外补充PHP如何扩展?你并不需要再次安装PHP.同phpize我们可以在原PHP安装扩展直接的基础上,. 这次编译只不过单独编译PHP的扩展库.接下来将编译好 ...

  8. Xcode 凝视代码

    #pragma mark ---------------凝视信息-------------------- -(void)RequestSP { // MARK: 凝视信息 // TODO: 凝视信息 ...

  9. Lua中的weak表——weak table(转)

    弱表(weak table)是一个很有意思的东西,像C++/Java等语言是没有的.弱表的定义是:A weak table is a table whose elements are weak ref ...

  10. Spark SQL源代码分析之核心流程

    /** Spark SQL源代码分析系列文章*/ 自从去年Spark Submit 2013 Michael Armbrust分享了他的Catalyst,到至今1年多了,Spark SQL的贡献者从几 ...