0.前言

  其实大概半年前就已经看过网络编程Socket的知识了(传统IO),但是因为长时间的不使用导致忘的一干二净,最近正好准备校招,又重新看了网络编程这一章,
  是传统IO(BIO)相关的内容,故在此记录!!记完笔记就去看nio的网络编程啦!!!

1.基础概念

首先看一下socket单词的翻译:
  socket n. 插座;窝,穴;牙槽   IP: 电脑的身份证
  
  端口号: 识别你电脑上的不同程序 场景: 小宇用电脑QQ发消息问小燕吃饭了没,小燕说吃了哦。
    为啥子小宇发消息,是小燕收到,而不是小红小白收到,
        这个就是IP这位大哥的作用啦,小宇给消息加上了IP,在广阔的网络中,消息小弟根据IP大哥的引路找到了小燕的电脑。     再问:为啥是小燕的QQ收到了消息,而不是小燕的谷歌浏览器收到消息,这时候端口大哥就可以出场了,
       消息到了小燕电脑,IP大哥就不管事了,由端口号大哥引路找到了QQ这个程序
  

  socket百度是这样定义的

    网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。

    那么简单理解下: 也就是每个程序上都有一个插座,只要我们用一根有双向插头的线(得给这个线加上IP和端口号哦),哐,一连,这两个程序就可以互相交流啦。

    当然连接的时候需要经过三次挥手,释放的时候需要进过四次挥手。 最近在重温计算机网络,这部分以后再加上去哈!

2.简单的示例

  首先服务端需要暴露出一个端口 也可以说监听一个端口,客户端根据IP和端口进行连接,服务器接收到了这个连接请求,同意,再创建一个Socket和那个客户端的Socket进行连接。

  

  客户端:连接得需要ip地址和端口吧,顺便发送点什么。

package com.socket;

import java.io.OutputStream;
import java.net.Socket; public class TCPClient {
public static void main(String[] args) throws Exception {
//系统随机选择一个端口 连接指定的ip地址和端口
Socket socket = new Socket("127.0.0.1", 8888);
OutputStream os = socket.getOutputStream();
os.write("吃了嘛".getBytes());
os.close();
socket.close();
}
}

  服务器端:服务器首先也得搞个插头,但是他不是谁想连就可以连,这样太不合理,别人连了得先得到服务器端得同意

  

package com.socket;

import java.net.ServerSocket;
import java.net.Socket; public class TCPServer {
public static void main(String[] args) throws Exception {
//Server起一个插座(套接字)监听一个连接
ServerSocket serverSocket = new ServerSocket(8888);
//服务器端总不能停吧,写一个死循环
while (true) {
//serverSocket获得同意,再建立一个socket
Socket socket = serverSocket.accept();
System.out.println("client is connect!!!!!");
}
}
}

3.破产版Tomcat

  客户端:浏览器

  服务端:MyTomcat , 因为要在浏览器中显示所以必须要弄成HTTP协议的。所以这里封装了两个类,分别是Request和Reponse。

  因为是破产版的 所以下面这张图的很多功能都没实现!!! 而且在NIO的网络模型中应该不是利用InputStream获得请求报文了

  

  

package com.socket.tomcat;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader; public class Request { //请求方法
private String method; private String url; public Request(InputStream inputStream) throws Exception {
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream, "utf-8"));
String[] input = bufferedReader.readLine().split(" ");
this.method = input[0];
url = input[1];
} public String getMethod() {
return method;
} public void setMethod(String method) {
this.method = method;
} public String getUrl() {
return url;
} public void setUrl(String url) {
this.url = url;
}
}
package com.socket.tomcat;

import java.io.OutputStream;

public class Reponse {
private OutputStream outputStream; public static String repsonsedHead = "HTTP/1.1 200 \r\n" + "Content-Type:text/html\r\n" + "\r\n"; public Reponse(OutputStream outputStream) {
this.outputStream = outputStream;
} public void write(String msg) throws Exception {
outputStream.write((repsonsedHead + msg).getBytes());
}
}
package com.socket.tomcat;

import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket; public class MyTomcat { public static void main(String[] args) throws Exception { ServerSocket serverSocket = new ServerSocket(8080); while (true) {
Socket socket = serverSocket.accept(); InputStream is = socket.getInputStream();
//获得请求
Request request = new Request(is); System.out.println("请求方法:" + request.getMethod());
System.out.println("请求路径:" + request.getUrl()); OutputStream os = socket.getOutputStream();
Reponse reponse = new Reponse(os);
reponse.write("Java!"); is.close();
os.flush();
os.close();
socket.close(); } }
}

Java Socket网络编程学习笔记(一)的更多相关文章

  1. JAVA UDP网络编程学习笔记

    一.UDP网络编程概述 采用TCP协议通信时,客户端的Socket必须先与服务器建立连接,连接建立成功后,服务器端也会持有客户端连接的Socket,客户端的Socket与服务器端的Socket是对应的 ...

  2. JAVA TCP网络编程学习笔记

    一.JAVA网络编程概述 网络应用程序,就是在已实现网络互联的不同计算机上运行的应用程序,这些程序之间可以相互交换数据.JAVA是优秀的网络编程语言,Java网络编程的类库位于java.net包中.J ...

  3. 转 网络编程学习笔记一:Socket编程

    题外话 前几天和朋友聊天,朋友问我怎么最近不写博客了,一个是因为最近在忙着公司使用的一些控件的开发,浏览器兼容性搞死人:但主要是因为这段时间一直在看html5的东西,看到web socket时觉得很有 ...

  4. Java Socket 网络编程心跳设计概念

    Java Socket 网络编程心跳设计概念   1.一般是用来判断对方(设备,进程或其它网元)是否正常动行,一 般采用定时发送简单的通讯包,如果在指定时间段内未收到对方响应,则判断对方已经当掉.用于 ...

  5. Java网络编程学习笔记

    Java网络编程,我们先来看下面这一张图: 由图可得:想要进行网络编程,首先是服务器端通过ServerSocket对某一个端口进行监听.通过accept来判断是否有客户端与其相连.若成功连上,则通过r ...

  6. 网络编程学习笔记(二)基于TCP的Socket编程

    1.Socket:英文意思插座.两个Java应用程序可以通过一个双向的网络通信连接实现数据交换,这个双向链路的一端称为一个Socket. 2.Socket通常用来实现client-server(客户端 ...

  7. 网络编程学习笔记:Socket编程

    文的主要内容如下: 1.网络中进程之间如何通信? 2.Socket是什么? 3.socket的基本操作 3.1.socket()函数 3.2.bind()函数 3.3.listen().connect ...

  8. 网络编程学习笔记一:Socket编程

    “一切皆Socket!” 话虽些许夸张,但是事实也是,现在的网络编程几乎都是用的socket. ——有感于实际编程和开源项目研究. 我们深谙信息交流的价值,那网络中进程之间如何通信,如我们每天打开浏览 ...

  9. 网络编程学习笔记--1.socket可读可写条件

    转至 :http://blog.csdn.net/majianfei1023/article/details/45788591 socket可读可写条件,经常做为面试题被问,因为它考察被面试者对网络编 ...

随机推荐

  1. 为什么导入本地jquery.js老是无效?(已解决)

    我从jquery官网里复制过来jquery.js内容,然后粘贴到本地,但是引用的时候总是无效. 在翻看脚本所在目录,无意间发现脚本文件是个jquery.js.js,    原来是我的文件的扩展名的问题 ...

  2. Springboot入门之分布式事务管理

    springboot默认集成事务,只主要在方法上加上@Transactional即可. 分布式事务一种情况是针对多数据源,解决方案这里使用springboot+jta+atomikos来解决 一.po ...

  3. PDF转换成Word,ppt转换成word

    pdf与word我没找到直接转换的方式,不过可以用间接方式嘛! pdf ==>picture ==>word!ppt转word的原理也是先把ppt转成图片,再把图片插入word! 先准备好 ...

  4. 数据库索引使用数据结构及算法, 及MySQL不同引擎索引实现

    摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BT ...

  5. Trie 简介

    一.Trie简介 在计算机科学中,Trie,又称字典树.前缀树.单词查找树或键树,是一种树形结构,是一种哈希树的变种.典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎 ...

  6. YOU种你来丨i春秋校园行第一站北京电子科技学院

    发通告啦 i春秋互联网安全校园行即将火爆开启,第一站我们将来到北京电子科技学院.对网络安全感兴趣的大学生们注意啦,我们将走进校园送福利,Are you ready? i春秋简介 i春秋拥有全国最大的网 ...

  7. [Swift]LeetCode852. 山脉数组的峰顶索引 | Peak Index in a Mountain Array

    Let's call an array A a mountain if the following properties hold: A.length >= 3 There exists som ...

  8. JQ 放大镜

     <!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title> ...

  9. .NET Core中的CSV解析库

    感谢 本篇首先特别感谢从此启程兄的<.NetCore外国一些高质量博客分享>, 发现很多国外的.NET Core技术博客资源, 我会不定期从中选择一些有意思的文章翻译总结一下. .NET ...

  10. Chapter 5 Blood Type——25

    "I usually am — but about what in particular this time?" “我通常都是 —— 但是这次有什么特殊的吗?” "Dit ...