1.Socket网络编程之传递字符类型(图解与编码)

2015年05月09日 09:50:42

阅读数:1886

Java最初是作为网络编程语言出现的,它对网络的高度支持,使得客户端和服务器流畅的沟通变成现实。而在网络编程中,使用最多的就是Socket,每一个实用的网络程序都少不了它的参与。但Socket的底层机制却相当棘手,幸运的是,Java平台给我们一些虽然简单但是相当强大的类,可以使你更简单有效的使用Socket开发而无需了解底层机制。

请思考一下网络编程要解决的问题:而下面这些问题都可以用Socket来解决

  1. 如何建立两个节点(电脑)之间的网络连接?
  2. 如何向另外一个节点(电脑)发送信息?
  3. 如何从外部节点(电脑)接收一个请求并给予响应?
  4. 如何利用网络协议(TCP、UPD)?

Socket在英文中是插座的意思,在应用程序中称为“套接字”,应用程序通过“套接字”向网络发现请求或者应答网络请求,最早是UNIX上的一套网络程序通讯的标准,

已被广泛移植到了其他平台。

Socket实质上提供了进程通信的端点,网络上的两个程序通过一个双向的通讯链路实现数据的交换,这个双向链路的一端称为一个Socket。

ServerSocket类常用方法如下:

O了,讲了这么多理论原理的东西,我来讲讲编码方面的知识吧,上述理论只是过一个大概,并不详细,若对理论感兴趣的,可以上网上查询相关资料:

我写了一个简单的例子:一个Socket服务器,一个是调用此服务器端口的客户端。以下例子就是客户端向服务器的请求。代码如下:

  1. package com.qhs.sockettest;
  2. import java.io.BufferedReader;
  3. import java.io.IOException;
  4. import java.io.InputStream;
  5. import java.io.InputStreamReader;
  6. import java.net.ServerSocket;
  7. import java.net.Socket;
  8. /**
  9. * Socket服务器相关代码
  10. * 编码完成后,要先运行服务器开启端口,然后再运行客户端。
  11. */
  12. public class LoginServer {
  13. public static void main(String args []){
  14. try {
  15. //1.建立一个服务器Socket绑定一个端口并开始监听
  16. ServerSocket serverSocket = new ServerSocket( 8800);
  17. //2.使用accept()方法阻塞等待监听,获得新的连接
  18. Socket socket = serverSocket.accept();
  19. //3.获得输入流
  20. InputStream is = socket.getInputStream();
  21. BufferedReader br = new BufferedReader( new InputStreamReader(is));
  22. //4.获得用户输入信息
  23. String info = null;
  24. while(!((info=br.readLine())== null)){
  25. System.out.println( "我是服务器,用户信息为:" + info);
  26. }
  27. //5.关闭资源
  28. br.close();
  29. is.close();
  30. socket.close();
  31. serverSocket.close();
  32. } catch (IOException e) {
  33. // TODO Auto-generated catch block
  34. e.printStackTrace();
  35. }
  36. }
  37. }

客户端代码如下:

  1. package com.qhs.sockettest;
  2. import java.io.IOException;
  3. import java.io.OutputStream;
  4. import java.io.PrintWriter;
  5. import java.net.Socket;
  6. import java.net.UnknownHostException;
  7. /**
  8. * 客户端
  9. */
  10. public class LoginClient {
  11. public static void main(String args []){
  12. try {
  13. //1.建立客服端Socket连接,指定服务器的位置以及端口
  14. Socket socket = new Socket( "localhost", 8800);
  15. //2.得到Socket读写流
  16. OutputStream os = socket.getOutputStream();
  17. PrintWriter pw = new PrintWriter(os);
  18. //3.利用流按照一定协议对Socket进行读/写操作
  19. String info = "用户名:Jeff;用户密码:123456";
  20. pw.write(info);
  21. pw.flush();
  22. //4.关闭资源
  23. pw.close();
  24. os.close();
  25. socket.close();
  26. } catch (UnknownHostException e) {
  27. // TODO Auto-generated catch block
  28. e.printStackTrace();
  29. } catch (IOException e) {
  30. // TODO Auto-generated catch block
  31. e.printStackTrace();
  32. }
  33. }
  34. }

测试进行时,请先运行服务器的代码,使得端口打开。然后再运行客户端去连接。最后在控制台输入的结果如图:

上面的例子就比如一个人打电话,另外一个人只是听,不说话,单向通信。所以运行后,后台只有客户端有服务器的信息

接下来,我们在上述代码中添加一些代码,使得服务器也有响应,等于双方相互通信的目的:

服务器代码:

  1. package com.qhs.sockettest;
  2. import java.io.BufferedReader;
  3. import java.io.IOException;
  4. import java.io.InputStream;
  5. import java.io.InputStreamReader;
  6. import java.io.OutputStream;
  7. import java.io.PrintWriter;
  8. import java.net.ServerSocket;
  9. import java.net.Socket;
  10. /**
  11. * Socket服务器相关代码
  12. * 编码完成后,要先运行服务器开启端口,然后再运行客户端。
  13. */
  14. public class LoginServer {
  15. public static void main(String args []){
  16. try {
  17. //1.建立一个服务器Socket绑定一个端口并开始监听
  18. ServerSocket serverSocket = new ServerSocket( 8800);
  19. //2.使用accept()方法阻塞等待监听,获得新的连接
  20. Socket socket = serverSocket.accept();
  21. //3.获得输入流
  22. InputStream is = socket.getInputStream();
  23. BufferedReader br = new BufferedReader( new InputStreamReader(is));
  24. //服务器的响应加进来的代码:获得输出流
  25. OutputStream os = socket.getOutputStream();
  26. PrintWriter pw = new PrintWriter(os);
  27. //4.获得用户输入信息
  28. String info = null;
  29. while(!((info=br.readLine())== null)){
  30. System.out.println( "我是服务器,用户信息为:" + info);
  31. }
  32. //添加代码:给客户一个响应
  33. String reply = "服务的响应>>>>Welcome!";
  34. pw.write(reply);
  35. pw.flush();
  36. //5.关闭资源
  37. pw.close();
  38. os.close();
  39. br.close();
  40. is.close();
  41. socket.close();
  42. serverSocket.close();
  43. } catch (IOException e) {
  44. // TODO Auto-generated catch block
  45. e.printStackTrace();
  46. }
  47. }
  48. }

客户端代码:

  1. package com.qhs.sockettest;
  2. import java.io.BufferedReader;
  3. import java.io.IOException;
  4. import java.io.InputStream;
  5. import java.io.InputStreamReader;
  6. import java.io.OutputStream;
  7. import java.io.PrintWriter;
  8. import java.net.Socket;
  9. import java.net.UnknownHostException;
  10. /**
  11. * 客户端
  12. */
  13. public class LoginClient {
  14. public static void main(String args []){
  15. try {
  16. //1.建立客服端Socket连接,指定服务器的位置以及端口
  17. Socket socket = new Socket( "localhost", 8800);
  18. //2.得到Socket读写流
  19. OutputStream os = socket.getOutputStream();
  20. PrintWriter pw = new PrintWriter(os);
  21. //添加代码:输入流
  22. InputStream is = socket.getInputStream();
  23. BufferedReader br = new BufferedReader( new InputStreamReader(is));
  24. //3.利用流按照一定协议对Socket进行读/写操作
  25. String info = "用户名:Jeff;用户密码:123456";
  26. pw.write(info);
  27. pw.flush();
  28. socket.shutdownOutput(); //关闭socket
  29. //添加代码:接收服务器响应并打印显示
  30. String reply = null;
  31. while(!((reply=br.readLine())== null)){
  32. System.out.println( "我是客户端,接收到服务器的响应为:" + reply);
  33. }
  34. //4.关闭资源
  35. br.close();
  36. is.close();
  37. pw.close();
  38. os.close();
  39. socket.close();
  40. } catch (UnknownHostException e) {
  41. // TODO Auto-generated catch block
  42. e.printStackTrace();
  43. } catch (IOException e) {
  44. // TODO Auto-generated catch block
  45. e.printStackTrace();
  46. }
  47. }
  48. }

我们运行测试一下,先运行服务器,再运行客户端。我们会看到,这次后台不只是客户端接收到了服务器给的请求信息,在服务器后台,也输出了相应的响应信息:我们可以点击下图所示的切换来查看客户端与服务器接收与响应的后台信息:

最后,我们来总结一下Socket中服务器与客户端的各步骤。

服务器端:

  1. 建立一个服务器Socket绑定指定的端口并开始监听;
  2. 使用accept()方法阻塞等待监听,获取新的连接;
  3. 建立输入和输出流;
  4. 在已有的协议上产生会话;
  5. 使用close()方法关闭流和Socket;

客户端:

  1. 建立客户端Socket连接,指定服务器的位置以及端口;
  2. 得到Socket的读写流;
  3. 利用流按照一定的协议对Socket进行读/写操作;
  4. 使得close()方法关闭流和Socket

这是Socket网络编程之传递字符类型,接下来我会在我博客另外一篇中Socket升级传递对象编程

客户端与服务器的数据传输相关推荐

  1. Android:客户端和服务器之间传输数据加密

    Android客户端与服务器进行数据传输时,一般会涉及到两类数据的加密情况,一类是只有创建者才能知道的数据,比如密码:另一类是其他比较重要的,但是可以逆向解密的数据. 第一类:密码类的数据,为了让用户 ...

  2. 前端、后台、客户端以及服务器

    以下文章是结合网络资料以及自己的实践经验,从产品经理的角度出发,如何去区分:前端.后台.客户端以及服务器,这四者之间既是独立的,又是紧密相连的.如下是正文内容: 一.前端 1)Html:html是一种 ...

  3. 一种即时通信数据传输方法、客户端、服务器及系统

    一种即时通信数据传输方法.客户端.服务器及系统  摘要 本发明实施例提供一种即时通信数据传输方法.客户端.服务器及系统,其中,方法可以包括:向服务器发送传输控制协议TCP连接建立请求,建立与所述服务器 ...

  4. c++ Socket实现客户端与服务器数据传输

    c++ Socket实现客户端与服务器数据传输 这是自己第二次写博客,希望在博客记录自己的学习过程,欢迎大家评论! 实现: 客户端往服务器端发送一条数据,服务器端接收数据并输出; 服务器端再发送出接收 ...

  5. Socket 通信原理(Android客户端和服务器以TCPUDP方式互通)

     ZERO.前言 有关通信原理内容是在网上或百科整理得到,代码部分为本人所写,如果不当,还望指教. 一.Socket通信简介 Android与服务器的通信方式主要有两种,一是Http通信,一是So ...

  6. Linux下不同服务器间数据传输

    因为工作原因,需要经常在不同的服务器见进行文件传输,特别是大文件的传输,因此对linux下不同服务器间数据传输命令和工具进行了研究和总结.主要是rcp,scp,rsync,ftp,sftp,lftp, ...

  7. 客户端与服务器cookie

    认识cookie 第一部分: 概要 cookie是一种早期使用的客户端存储机制(现在仍在广泛使用),cookie数据会在Web浏览器和Web服务器之间传输, 因为早期cookie是针对服务器脚本设计的 ...

  8. linux下不同服务器间数据传输(rcp,scp,rsync,ftp,sftp,lftp,wget,curl)

    因为工作原因,需要经常在不同的服务器见进行文件传输,特别是大文件的传输,因此对linux下不同服务器间数据传输命令和工具进行了研究和总结.主要是rcp,scp,rsync,ftp,sftp,lftp, ...

  9. 从客户端登陆服务器的配置文件,BLE模式和配置文件

    BLE模式和配置文件(原文) 本文档探讨了BLE如何工作,特别是如何将两种BLE模式(连接和广告)用于不同的目的. 外围设备和中央设备vs服务器和客户端 当我们通过BLE连接设备时,我们将它们视为外设 ...

最新文章

  1. SQLite 安装(http://www.w3cschool.cc/sqlite/sqlite-installation.html)
  2. 基于百度理解与交互技术实现机器问答
  3. php统计在线时长,js统计网站运行时长
  4. 解决Android 输入法InputMethodService 显示时让原Activity大小计算错误问题
  5. 为 Notepad++ 安装 NppFTP 插件,查看修改虚拟机上的文本文件
  6. 油库蓝牙+北斗RTK人员定位方案解析
  7. 离散数学 第一章 部分课后习题
  8. 【javaWeb学习笔记】HTML,CSS,JS
  9. Linux 第一次学习笔记
  10. 一个网页设计需求方眼中的网页设计
  11. 【异常】git提示Ask a project Owner or Maintainer to create a default branch
  12. node-@hapi/joi校验前端数据
  13. java捕鱼设计_JAVA毕业设计教程:用swing实现捕鱼达人代码教程
  14. Python从入门到实践
  15. <Operating System Concepts> 第九版 第一章习题答案(原创)
  16. 5.1 频率响应概述
  17. 数据挖掘实战(2)——糖尿病数据集(回归问题)
  18. 全国优秀计算机动画作品,全国“xx杯”计算机应用基础类说课大赛优秀作品:同步动画教学课件.pptx...
  19. 年终总结没有思路?别怕,这里有一个万能写法
  20. 【Problems】:JSON parse error: Invalid UTF-8 start byte 0xbd;

热门文章

  1. SpringBoot部署子工程java -jar启动时报错:xxxxxxx.jar中没有主清单属性
  2. oracle通信通道的文件结尾_“ORA-03113: 通信通道的文件结尾”报错处理
  3. C++常见的三种中文内码转换代码
  4. 对数似然函数值/最大近然估计/log likelihood
  5. 无人机开发系列 Ubuntu18.04安装 含虚拟机与双系统
  6. 如何PC机上搭建 中标麒麟系统+达梦数据库的开发环境
  7. 基于深度学习的农作物病虫害识别
  8. 即将告别--新纪元网站
  9. 进程间通信的方式——信号、管道、消息队列、共享内存
  10. “华为”和“荣耀”的区别,双品牌满足我和爸妈的不同需求