Java Socket网络编程学习笔记(一)
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网络编程学习笔记(一)的更多相关文章
- JAVA UDP网络编程学习笔记
一.UDP网络编程概述 采用TCP协议通信时,客户端的Socket必须先与服务器建立连接,连接建立成功后,服务器端也会持有客户端连接的Socket,客户端的Socket与服务器端的Socket是对应的 ...
- JAVA TCP网络编程学习笔记
一.JAVA网络编程概述 网络应用程序,就是在已实现网络互联的不同计算机上运行的应用程序,这些程序之间可以相互交换数据.JAVA是优秀的网络编程语言,Java网络编程的类库位于java.net包中.J ...
- 转 网络编程学习笔记一:Socket编程
题外话 前几天和朋友聊天,朋友问我怎么最近不写博客了,一个是因为最近在忙着公司使用的一些控件的开发,浏览器兼容性搞死人:但主要是因为这段时间一直在看html5的东西,看到web socket时觉得很有 ...
- Java Socket 网络编程心跳设计概念
Java Socket 网络编程心跳设计概念 1.一般是用来判断对方(设备,进程或其它网元)是否正常动行,一 般采用定时发送简单的通讯包,如果在指定时间段内未收到对方响应,则判断对方已经当掉.用于 ...
- Java网络编程学习笔记
Java网络编程,我们先来看下面这一张图: 由图可得:想要进行网络编程,首先是服务器端通过ServerSocket对某一个端口进行监听.通过accept来判断是否有客户端与其相连.若成功连上,则通过r ...
- 网络编程学习笔记(二)基于TCP的Socket编程
1.Socket:英文意思插座.两个Java应用程序可以通过一个双向的网络通信连接实现数据交换,这个双向链路的一端称为一个Socket. 2.Socket通常用来实现client-server(客户端 ...
- 网络编程学习笔记:Socket编程
文的主要内容如下: 1.网络中进程之间如何通信? 2.Socket是什么? 3.socket的基本操作 3.1.socket()函数 3.2.bind()函数 3.3.listen().connect ...
- 网络编程学习笔记一:Socket编程
“一切皆Socket!” 话虽些许夸张,但是事实也是,现在的网络编程几乎都是用的socket. ——有感于实际编程和开源项目研究. 我们深谙信息交流的价值,那网络中进程之间如何通信,如我们每天打开浏览 ...
- 网络编程学习笔记--1.socket可读可写条件
转至 :http://blog.csdn.net/majianfei1023/article/details/45788591 socket可读可写条件,经常做为面试题被问,因为它考察被面试者对网络编 ...
随机推荐
- Get API
根据索引.类型和ID获取文档 GET twitter/_doc/1 返回结果如下: { "_index": "twitter", "_type&quo ...
- Python基础之面向对象3(继承)
一.继承相关概念 1.语法: 2.定义: 3.优缺点: 4.相关概念: 5.相关内置函数: 6.继承内存图: 7.多继承: 二.多态相关概念 1.定义及作用: 2.重写概念: 3.运算符重载: 定义: ...
- LinkedBlockingQueue 注记
近期看一个音频传输代码时,对方采用了LinkedBlockingQueue为生产者.消费者模式,来支撑读写线程. 个人感觉非常不错,因此也对这种方式进行总结,并梳理了一个基本的功能框架备用.主要两点: ...
- React-Native的基本控件属性方法,对React-Native的学习,从熟悉基本控件开始。
对React-Native的学习,从熟悉基本控件开始. View 属性方法 序号 名称 属性Or方法 类型 说明 1 accessibilityLabel 属性 string 2 accessib ...
- 大数据与云计算的关系是什么,Hadoop又如何参与其中?Nosql在什么位置,与BI又有什么关系?
大数据与云计算的关系是什么,Hadoop又如何参与其中,Nosql在什么位置,与BI又有什么关系?以下这篇文字讲他们的关系讲的非常清楚. 在谈大数据的时候,首先谈到的就是大数据的4V特性,即类型复杂 ...
- Hadoop伪分布式配置
一步一步来: 安装VMWARE简单,安装CentOS也简单 但是,碰到了一个问题:安装的虚拟机没有图形化界面 最后,我选择了CentOS-7-x86_64-DVD-1503-01.iso镜像 配置用户 ...
- [Swift]LeetCode525. 连续数组 | Contiguous Array
Given a binary array, find the maximum length of a contiguous subarray with equal number of 0 and 1. ...
- 机器学习入门18 - 生产机器学习系统(Production ML Systems)
除了实现机器学习算法之外,机器学习还包含许多其他内容.生产环境机器学习系统包含大量组件.无需自行构建所有内容,而是应该尽可能重复使用常规机器学习系统组件.通过了解机器学习系统的一些范例及其要求,可以明 ...
- vue项目安装vux
本文章默认基于“vue init webpack myproject”已经搭好基本的项目, 而且本文是从我有道笔记拷贝稍加修改过来的 本来我私人笔记写给自己看的所以有些地方可能描述不够清晰 需要修改的 ...
- Linux 中改变主机名的 4 种方法
今天,我们将向你展示使用不同的方法来修改主机名.你可以从中选取最适合你的方法. 使用 systemd 的系统自带一个名为 hostnamectl 的好用工具,它可以使我们能够轻易地管理系统的主机名. ...