#开头的废话#学习java已经半个月了,原本在抠教材里面的字眼时,觉得教材好厚,要看完不知道要到猴年马月去了。突然在网上看到一个教程,里面老师说学编程语言书不用太细看,看个大概,知道里面讲些什么就好,不用全记得,然后你一个劲地编,使劲地编,编的时候不懂再回来看就好了,这是最快的方法。心里一琢磨,还真是这样,根据以前学C语言的情况不就这样吗。所以便加速看,把一些书里介绍的方法,类飞速地浏览过了,刷到网络这一章,觉得socket编程应该是得试一下手,不要只看不做假把式。


此文为原创,转摘请注明转摘自http://www.cnblogs.com/liusxg/p/3917624.html

  socket编程:

      一:什么是socket:socket是BSD UNIX的通信机制,通常称为“套接字”,其英文原意是“孔”或“插座”。有些顾名思义,socket正如其英文原意一样,像是一个多孔插座,可以提供多个端口的连接服务。

    为了更加直观的了解socket,可以用插座来比喻socket。

    如果说socket是一个多孔插座,插座是提供各种电器供电的地方,不同的电器工作时需要的电压和电流也不一样,但各种电器都有各自的一个插口,这个称之为“端口”。电器使用的电可以看做是网络资源或者是各种“流”,电是由电线传输过来的,所以插座需要连接电线,这里电线也就是服务器和客户端连接  “connection”。 其中初始化socket的过程像是买来一个插座的安装过程。

在插座这边的是“客户端”,电线那边提供电的发电厂是“服务器”。客户端和发电厂都各自拥有一个地址,即“IP地址”。其中还有一套传输和用电的规则,比如传输电时需要的电线多少伏才能满足需求,电器用电的技术参数,端口是几个孔的。这个是“协议”。正常情况下我们是不会去管协议的内容是什么,也就是说协议在我们面前是隐藏的。

下图可以有一些理解(图摘自源码工作室):

      

    二.工作原理:对于服务器来说,服务器先初始化socket,然后端口绑定(bind),再对端口监听(listen),调用accept阻塞,等待客户端连接请求。对于客户端来说,客户端初始化socket,然后申请连接(connection)。客户端申请连接,服务器接受申请并且回复申请许可(这里要涉及TCP三次握手连接),然后发送数据,最后关闭连接,这是一次交互过程。

      如下图(图摘自源码工作室):

      

    客户端Client源码如下:

 import java.io.*;
import java.net.*; public class Client { public static void main(String[] args) throws Exception {
// TODO 自动生成的方法存根 String readline = null;
String inTemp = null;
//String outTemp = null;
String turnLine = "\n";
final String client = "Client:";
final String server = "Server:"; int port = 4000;
byte ipAddressTemp[] = {127, 0, 0, 1};
InetAddress ipAddress = InetAddress.getByAddress(ipAddressTemp); //首先直接创建socket,端口号1~1023为系统保存,一般设在1023之外
Socket socket = new Socket(ipAddress, port); //创建三个流,系统输入流BufferedReader systemIn,socket输入流BufferedReader socketIn,socket输出流PrintWriter socketOut;
BufferedReader systemIn = new BufferedReader(new InputStreamReader(System.in));
BufferedReader socketIn = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter socketOut = new PrintWriter(socket.getOutputStream()); while(readline != "bye"){ System.out.println(client);
readline = systemIn.readLine();
//System.out.println(readline); socketOut.println(readline);
socketOut.flush(); //赶快刷新使Server收到,也可以换成socketOut.println(readline, ture) //outTemp = readline;
inTemp = socketIn.readLine(); //System.out.println(client + outTemp);
System.out.println(server + turnLine + inTemp); } systemIn.close();
socketIn.close();
socketOut.close();
socket.close(); } }

     服务器Server源码如下:

import java.io.*;
import java.net.*; public class Server { public static void main(String[] args) throws Exception {
// TODO 自动生成的方法存根 String readline = null;
String inTemp = null;
//String outTemp = null;
String turnLine = "\n";
final String client = "Client:";
final String server = "Server:"; int port = 4000;
//byte ipAddressTemp[] = {127, 0, 0, 1};
//InetAddress ipAddress = InetAddress.getByAddress(ipAddressTemp); //首先直接创建serversocket
ServerSocket serverSocket = new ServerSocket(port);

     //调用服务器的accept()进行阻塞(程序会在这等待),当有申请连接时会打开阻塞并返回一个socket
Socket socket = serverSocket.accept(); //创建三个流,系统输入流BufferedReader systemIn,socket输入流BufferedReader socketIn,socket输出流PrintWriter socketOut;
BufferedReader systemIn = new BufferedReader(new InputStreamReader(System.in));
BufferedReader socketIn = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter socketOut = new PrintWriter(socket.getOutputStream()); while(readline != "bye"){ inTemp = socketIn.readLine();
System.out.println(client + turnLine + inTemp);
System.out.println(server); readline = systemIn.readLine(); socketOut.println(readline);
socketOut.flush(); //赶快刷新使Client收到,也可以换成socketOut.println(readline, ture) //outTemp = readline; //System.out.println(server); } systemIn.close();
socketIn.close();
socketOut.close();
socket.close();
serverSocket.close(); } }

  

    调试结果如下:

    

  调试的时候要先启动服务器,客户端查不到服务器就运行不了。

  运行效果还是很好的,幸运的是写完直接就可以运行了,关键是思路对,由此我总结出了一个规律,不管要做什么项目,首先要查阅资料,了解并理解其原理,还要思路清晰,这样子才能保证程序的成功率。还要多查阅java手册可以知道各种类的构造函数,返回值。提供一个java手册下载网址http://www.jb51.net/books/128276.html

  另外通过socket编程还学会了一个调试的小技巧,就是多显示器的调试按这个小三角就好了

基于java的socket编程的更多相关文章

  1. Java基于TCP的Socket编程练习

    环境:Notpad ++ 6.0 + JDK 6.0.31 问题:使用套接字编写客户-服务器程序,实现客户-服务器交互计算.客户将三角形3个边的长度发给服务器,服务器把计算出的三角形的面积返回给客户. ...

  2. Java网络编程学习A轮_07_基于Buffer的Socket编程

    示例代码: https://github.com/gordonklg/study,socket module A. LineSeparate 基于 Buffer 实现逐行读取的 EchoServer ...

  3. 【转】java的socket编程

    转自:http://www.cnblogs.com/linzheng/archive/2011/01/23/1942328.html 一,网络编程中两个主要的问题 一个是如何准确的定位网络上一台或多台 ...

  4. Java笔记 - Socket编程

    两个Java应用程序可以通过一个双向的网络通讯连接实现数据交换,这个双向链路的一端称为一个Socket.java.net包中定义的两个类Socket和ServerSocket,分别用来实现双向链路的c ...

  5. 【JAVA】Socket 编程

    对于Java Socket编程而言,有两个概念,一个是ServerSocket,一个是Socket.服务端和客户端之间通过Socket建立连接,之后它们就可以进行通信了.首先ServerSocket将 ...

  6. JAVA之Socket编程

    网上对Socket的诠释很多,也很全,在这里我就不多说了,总之,现在的网络处处都在使用Socket.本帖是一个Socket的例子,用来模拟一个简单的登录系统,只有核心代码,访问数据库.输入神马的统统没 ...

  7. 基于win32的socket编程及程序实现

    初步研究了win32平台的Windows Sockets,它是Microsoft Windows的网络程序设计接口,它是从Berkeley Sockets扩展而来的,以动态链接库的形式提供给我们使用. ...

  8. 基于MFC的socket编程(异步非阻塞通信)

       对于许多初学者来说,网络通信程序的开发,普遍的一个现象就是觉得难以入手.许多概念,诸如:同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)等,初学者往往迷惑不清, ...

  9. 基于MFC的socket编程

    网络编程 1.windows 套接字编程(开放的网络编程接口)添加头文件#include<windows.h> 2.套接字及其分类 socket分为两种:(1)数据报socket:无连接套 ...

随机推荐

  1. SAP顾问发展

    关于SAP顾问发展的话题也不仅仅是一次的谈起,但是我想对于自己的规划很多人是否有没有深刻的考虑过.这对于你我来说都非常的重要,那么作为我来说,我仅仅把自己的观点阐述以供大家思考,希望对大家能有所帮助. ...

  2. 最后关于Pipeline完整的图如下:

    最后关于Pipeline完整的图如下:

  3. CocoStudio教程三:认识并利用CocoStudio的果实 运行2.2.1版本

    原文:CocoStudio教程三:认识并利用CocoStudio的果实 原文用的老版,用2.21搞起来好像有些问题,然后自己摸索了下,有的都是乱找的方法,只求能运行... 1,原文的CCJsonRea ...

  4. centos下 Vim快捷键操作命令大全

    Vim是一个超牛的编辑器,命令功能十分强大 .而且这些命令大都可以进行组合 ,比如,9yy命令表示复制9行内容,9表示要复制的行数,同样100dd表示删除100行,当数字和命令合作的时候,就比单纯的命 ...

  5. repo: 创建local manifest以及如何添加app到CM/Android build系统中

    The local manifest Creating a local manifest allows you to customize the list of repositories on you ...

  6. Android应用安全之Android APP通用型拒绝服务漏洞

    0xr0ot和Xbalien交流所有可能导致应用拒绝服务的异常类型时,发现了一处通用的本地拒绝服务漏洞.该通用型本地拒绝服务可以造成大面积的app拒绝服务. 针对序列化对象而出现的拒绝服务主要是由于应 ...

  7. uboot命令及内核启动参数

        修改:mw [内存地址] [值] [长度] 例如:mw 0x02000000 0 128 表示修改地址为0x02000000~0x02000000+128的内存值为0. 显示:md [内存地址 ...

  8. TypeWonder – 在任何网站上实时预览字体效果

    TypeWonder 让网页字体的选择过程变得轻松愉快.它可以帮助您在任何网站上快速测试 Web 字体效果!输入网站网址,就能够即时预览的字体的实际效果,还可以从数百种字体中进行挑选,您还可以得到所需 ...

  9. 《HelloGitHub月刊》第01期

    <HelloGitHub月刊> 因为现在这个项目只有我自己做,只敢叫"月刊",希望有志同道合者,快点加入到这个项目中来!同时,如果您有更好的建议或者意见,欢迎联系我.联 ...

  10. Redis设计与实现-附加功能

    发布与订阅 redis订阅分为精准的频道订阅与模糊匹配的模式订阅: redis将所有频道的订阅关系都保存在服务器状态pubsub_channels字典里,键是频道名,值是一个记录所有订阅此频道的客户端 ...