Socket是网络上两个程序间双向通讯的一端,它既可以发送请求,也可以接收请求,利用它可以方便的编写网络上数据的传递,在java中,有专门的类类处理用户的请求和响应。利用Socket 类的方法,就可以实现两台计算机之间的通信,那么怎么利用socket进行网络编程呢?我试试水~

网络中的进程之间是如何进行通信的?

本地进程间通信(IPC)有很多种方法,简而言之可以归结为以下四类:

  1. 消息传递(管道,FIFO,消息队列);
  2. 同步(互斥量,条件变量,读写锁,文件和写记录锁,信号量);
  3. 内存共享(匿名的和具体的,线程等);
  4. 远程过程调用(Solaris门和Sun RPC)。

那么,对于网络中的进程,如何实现通信呢?首先,我们要解决的是如何正确地唯一标识网络中的进程,在本地环境中,我们可以通过进程PID来进行标识,但是在网络中,不可以!但是网络中的IP地址却是唯一的可以标识一台计算机,而位于传输层的“网络+端口”可以唯一的标识主机中的应用程序(进程),这样,可以利用IP地址+协议+端口就可以标识网络中的进程啦!网络中的进程就可以利用这三元组和其他进程之间进行通信了!

使用TCP/IP协议的应用程序通常采用应用编程接口:UNIX BSD的套接字(socket)和UNIX System V的TLI(已经被淘汰),来实现网络进程之间的通信。就目前而言,几乎所有的应用程序都是采用socket,而现在又是网络时代,网络中进程通信是无处不在,这就是为什么有人说“一切皆socket”。

什么是Socket?

socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,都可以用“打开open –> 读写write/read –> 关闭close”模式来操作。我的理解就是Socket就是该模式的一个实现,socket即是一种特殊的文件,一些socket函数就是对其进行的操作(读/写IO、打开、关闭)。

socket接口是TCP/IP网络协议的API,socket接口设计者最先将接口放在UNIX操作系统里面,如果了解UNix系统的输入和输出,Socket就很好理解了,网络中的数据传输是一种特殊的I/O, Socket也是一种文件描述符,也具有一个类似于打开文件的函数调用socket(),该函数返回一个整形的socket描述符,随后的连接建立,数据传输等操作都是通过该socket实现的。常用的socket类型有两种,流式Socket和数据报式Socket(SOCK_DGRAM)。流式是一种面向连接的Socket,针对于面向连接的Tcp服务应用,而数据报式socket是一种面向非连接的UDP服务应用。

基于Socket的Java网络编程

Socket所支持的协议不光TCP/IP一种,因此两者之间没有必然的联系,在Java中,socket编程主要是基于TCP/IP协议的网络编程。主要过程是:Server端Listen(监听)某个端口是否有连接请求,Client端向Server端发出Connect(连接)请求,Server端向Client端发回Accept消息,这样,一个连接就建立起来了,Server端和Client端都可以通过send,write等方法与对方进行通信。

对于一个功能齐全的Socket,都要包含以下基本结构,其工作过程包含以下四个基本步骤:

1,创建Socket;

2,打开连接到Socket的输入输出流;

3,按照一定的协议对Socket进行读写操作;

4,关闭socket。

简单的例子:

客户端程序:

package com.leetch.socket;
import java.awt.*;
import java.io.*;
import java.net.*;
import java.io.StringReader;import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextArea;
public class TestClient {public static void main(String arg[]) throws Exception{Socket tsocket = new Socket("127.0.0.1",4700);PrintWriter os = new PrintWriter(tsocket.getOutputStream());  //由socket对象得到输出流,并构建PrintWriter对象BufferedReader bReader2 = new BufferedReader(new InputStreamReader(tsocket.getInputStream()));//由Socket对象得到输入流,并构造相应的BufferedReader对象Reader reader = StringReader(textArea.getText().toString());BufferedReader bReader = new BufferedReader(reader);//由textarea构造bufferedreader对象String readline = null;readline = bReader.readLine();while(!readline.equals("bye")){  //结束判断标志os.println(readline);  //把文本域里面的内容写到server端os.flush();System.out.println("Client:"+readline);System.out.println("Server:"+bReader2.readLine());readline = bReader.readLine();}os.close();bReader2.close();tsocket.close();}private static Reader StringReader(String string) {// TODO Auto-generated method stubreturn null;}
}

服务器端代码:

package com.leetch.socket;
import java.io.*;
import java.net.*;
import java.applet.Applet;public class TServer{public static void main(String args[]) {try{ServerSocket server=null;server=new ServerSocket(4700);System.out.println("正在监听端口...");  //创建一个ServerSocket在端口4700监听客户请求Socket socket=server.accept();   //创建一个socket,监听4700端口//由Socket对象得到输入流,并构造相应的BufferedReader对象BufferedReader is=new BufferedReader(new InputStreamReader(socket.getInputStream()));//由Socket对象得到输出流,并构造PrintWriter对象PrintWriter os=new PrintWriter(socket.getOutputStream());//由系统标准输入设备构造BufferedReader对象BufferedReader sin=new BufferedReader(new InputStreamReader(System.in));System.out.println("Client:"+is.readLine());//在标准输出上打印从客户端读入的字符串String readline;readline=sin.readLine();while(!readline.equals("quit")){   //终止条件os.println(readline);   //向客户端返回请求值,及时刷新os.flush();     System.out.println("Server响应:"+readline);        //在系统标准输出上打印读入的字符串System.out.println("Client请求:"+is.readLine());//读取client请求,并显示readline=sin.readLine();  }System.out.println("已中断连接...");os.close();is.close(); socket.close();server.close();}catch(Exception e0){e0.printStackTrace();}}
}

测试结果正确,客户端和服务器可以互通消息!

基于Socket实现网络编程相关推荐

  1. php事件编程,php如何实现基于事件驱动的网络编程

    php 如何实现基于事件驱动的网络编程 场景 当客户端发送数据到服务端,服务端返回相同信息. 保持连接 说明 接下来的所有代码仅用于简单的小demo 生产环境需要考虑代码的严谨性. 例子一 简单的接受 ...

  2. 基于Linux的网络编程——网络聊天程序

    网络聊天程序是目前应用极为广泛的一种网络软件,对于方便人们的交流沟通非常有效,同时,作为一种典型的网络应用,编写网络聊天程序是学习基于Linux的网络编程的有效方法. 结合任务需求设计该程序,程序采用 ...

  3. 基于Socket的网络即时通信系统

    摘 要 网络通信在当今信息社会中起着不可或缺的作用,人们可以利用网络通信技术进行即时的信息交流.例如,人们可以通过Internet搜索所要的信息,通过网上通信工具聊天,交流信息,上网购物等等. 本课题 ...

  4. Flex与.NET互操作(一):基于Socket的网络连接

    Flash/Flex也支持基于Socket的网络连接 ,服务器端可以是C++,VB,C#,Java等任一语言开发.监听一个网络端口便可以接收到Flash/Flex开发的客户端的连接. ActionSc ...

  5. 浅谈JAVA中如何利用socket进行网络编程(二)

    转自:http://developer.51cto.com/art/201106/268386.htm Socket是网络上运行的两个程序间双向通讯的一端,它既可以接受请求,也可以发送请求,利用它可以 ...

  6. TCP原理,Socket与网络编程入门

    TCP原理,Socket与网络编程入门 开篇 从互联网的诞生以来,网络程序逐渐普及.计算机网络将各个计算机连接到一起使它们可以通信.在现代,网络已成为我们十分重要的一部分.这次不搞些费脑子的东西,就让 ...

  7. 基于linux epoll网络编程细节处理丨epoll原理剖析

    epoll原理剖析以及三握四挥的处理 1. epoll原理详解 2. 连接的创建与断开 3. epoll如何连接细节问题 视频讲解如下,点击观看: 基于linux epoll网络编程细节处理丨epol ...

  8. java socket ip_JAVA 网络编程 TCP/IP、Socket 和协议设计

    [JAVA 网络编程 TCP/IP.Socket 和协议设计] TCP/IP 协议简介 IP 首先我们看 IP(Internet Protocol)协议.IP 协议提供了主机和主机间的通信. 为了完成 ...

  9. python 中的socket模块——网络编程(一)

    传输协议: 一个完整的计算机由硬件.操作系统.应用软件组成,具备者三个条件,一台计算机可以进行简单的单机游戏:扫雷等等,如果想要和别人一起玩,就需要上网了,甚麽是互联网?互联网的核心就是由一堆协议组成 ...

  10. java基于http协议编程_Java中基于HTTP协议网络编程

    java中为我们的网络支持提供了java.net包,能够使我们以编程的方式来访问Web服务功能,这篇博客,就跟大家分享一下,Java中的网络编程的知识,主要是学习下该java.net包下的API. U ...

最新文章

  1. 开源!《模式识别与机器学习(PRML)》笔记、代码、NoteBooks 发布
  2. 动态创建模板列并绑定数据(GridView,Repeater,DataGrid)
  3. python安装matlabb库_Python调用MATLAB的方法(mlab接口库)(未总结)-Go语言中文社区...
  4. 用python进行营销分析_用python进行covid 19分析
  5. 中蜂几月份自然分蜂_蜜蜂的种类:北黑蜂,中华蜜蜂,皖南中蜂,贵州纳雍中蜂等等...
  6. 永洪bi_案例分享!永洪BI助力知名三甲医院数字化转型升级
  7. php7 void,2.10.PHP7.1 女神级教程-女神的私人信息 -【PHP 函数】
  8. js点击按钮改变字体大小并给他颜色_如何在Elementor中修改文本的字体、大小、颜色、样式...
  9. 实体经济是因为自己不努力才落后的吗?
  10. jquery插件实现分页
  11. OFDM专题之多径效应引起的码间串扰问题
  12. 汉诺塔问题的总结(1)
  13. X-Order创始人陶荣祺:Libra让所有互联网应用成为开放金融的一部分
  14. 如何快速查询京东快递物流正在派送中的单号
  15. 看了他家的红木装修,彻底被圈粉了,庄重典雅又复古舒适
  16. Word2013使用 插入题注的方式为word自带编辑器编辑的公式进行编号
  17. 机器视觉设计,如何正确的选择相机和镜头?
  18. 国三数据库系统工程师与软考中的数据库工程师,谁的难度更高?
  19. Web Vue IV
  20. centos上通过ll或者du命令查看文件的大小

热门文章

  1. DBUtil-一款简单好用的数据库操作工具
  2. HDFS的命令行使用【常用 hdfs 命令】
  3. 可计算代数数论(2012-12-09 20:56、2013-03-23 21:39、2013-06-23 20:27、2013-06-23 20:32、2014-05-16 17:49)
  4. 数据库之SQL增删改查(UPDATE,DELETE,TOP,COMPUTE,WHERE子句)
  5. 测试工程师必备小工具指南
  6. linux dd 拷贝文件,Linux系统中使用dd命令来转换和拷贝文件
  7. 天线工程手册_天线的原理是什么!?它到底是怎么接收信号的?
  8. 网站建设如何选择CMS网站系统
  9. AB.RSLogix500软件 下载分享
  10. Systemview5安装的问题:the license for this version of systemview has expired......