学习笔记:

1.基于TCP协议的Socket网络编程:

  (1)Socket类构造方法:在客户端和服务器端建立连接

    Socket s = new Socket(hostName,port);以主机名和端口号作为参数来创建一个Socket对象。

    Socket s = new Socket(address,port);以InetAddress对象和端口号作为参数来创建一个Socket对象。

  创建Socket对象时可能抛出UnknownHostException或IOException异常,必须捕获它们。

  (2)常用方法

    InetAddress getInetAddress();返回与Socket对象关联的InetAddress

    int getPort();远程端口

    int getLocalPort();本地端口

    InputStream getInputStream();相关联的InputStream

    OutputStream getOutputStream();相关联的OutputStream

    void close();关闭该Socket

  (3)ServerSocket类:等待客户端建立连接,连接以后进行通信

    ServerSocket ss = new ServerSocket(port);接收端口号作为参数

    ServerSocket ss = new ServerSocket(port,maxqueue);接收端口号和最大队列长度作为参数。

    accept();等待客户端触发通信

 import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket; /**
* 使用Socket变成实现用户登录
* 1.实现单用户登录
* 2.服务器端关键代码
* @author Administrator
*
*/
public class Test0101 { public static void main(String[] args) {
try {
//创建一个服务器Socket(ServerSocket),指定端口8800并开始监听
ServerSocket serverSocket = new ServerSocket(8800);
//使用accept()方法等待客户端触发通信
Socket socket = serverSocket.accept();
//打开输入/输出流
InputStream is = socket.getInputStream();
OutputStream os = socket.getOutputStream();
//获取客户端信息,即从输入流读取信息
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String info = null;
while(!((info = br.readLine())==null)){
System.out.println("我是服务器,客户登录信息为:"+info);
}
socket.shutdownInput();
//给客户端一个响应,即向输出流写入信息
String reply = "欢迎你,登陆成功!";
os.write(reply.getBytes());
os.close();
br.close();
is.close();
socket.close();
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
} }
 import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException; /**
* 使用Socket变成实现用户登录
* 1.实现单用户登录
* 2.客户端关键代码
* @author Administrator
*
*/
public class Test01 { public static void main(String[] args) {
try {
//建立客户端Socket连接,指定服务器的位置为本机以及端口8800
Socket socket = new Socket("127.0.0.1",8800);
//打开输入/输出流
OutputStream os = socket.getOutputStream();
InputStream is = socket.getInputStream();
//发送客户端登录信息,即向输出流写入信息
String info = "用户名:Tom;用户密码:123456";
os.write(info.getBytes());
socket.shutdownOutput();
//接受服务器端的响应,即从输入流读取信息
String reply = null;
BufferedReader br = new BufferedReader(new InputStreamReader(is));
while(!((reply = br.readLine())==null)){
System.out.println("我是客户端,服务器端的响应为:"+reply);
}
//关闭资源
br.close();
is.close();
os.close();
socket.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} } }
 import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket; /**
* 服务器端关键代码
* @author Administrator
*
*/
public class Test0201 { public static void main(String[] args) {
try {
//创建一个服务器Socket(ServerSocket)连接,指定端口并开始监听
ServerSocket serverSocket = new ServerSocket(8800);
//使用accpet()方法等待客户端触发通信
Socket socket = serverSocket.accept();
//打开输入输出流
InputStream is = socket.getInputStream();
OutputStream os = socket.getOutputStream();
//反序列化
ObjectInputStream ois = new ObjectInputStream(is);
//获取客户端信息(从输入流读取信息)
User user = (User)ois.readObject();
if (!(user==null)) {
System.out.println("我是服务器端,客户登录信息为:\n用户名:"+user.getLoginName()+",密码:"+user.getPwd());
}
//给客户端一个响应(向输出流写入信息)
String reply = "欢迎你,登陆成功!";
os.write(reply.getBytes());
//关闭资源
os.close();
ois.close();
is.close();
socket.close();
serverSocket.close();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} } }
 import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException; /**
* 客户端关键代码
* @author Administrator
*
*/
public class Test02 { public static void main(String[] args) {
try {
//建立客户端Socket连接,指定服务器的位置和端口
Socket socket = new Socket("127.0.0.1",8800);
//打开输入输出流
OutputStream os = socket.getOutputStream();
InputStream is = socket.getInputStream();
//对象序列化
ObjectOutputStream oos = new ObjectOutputStream(os);
//发送客户端登录信息(向输出流写入数据)
User user = new User();
user.setLoginName("Tom");
user.setPwd("12345678");
oos.writeObject(user);
socket.shutdownOutput();
//接收服务器端的响应(从输入流读取信息)
String reply = null;
BufferedReader br = new BufferedReader(new InputStreamReader(is));
while(!((reply = br.readLine())==null)){
System.out.println("我是客户端,服务器端的响应为"+reply);
}
//关闭资源
br.close();
oos.close();
is.close();
os.close();
socket.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} } }

案例:实现多客户端用户登录

1.登录线程类

 import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.OutputStream;
import java.net.Socket; /**
* 登录线程类
* @author Administrator
*
*/
public class LoginThread extends Thread {
Socket socket = null;
//每启动一个线程,连接对应的Socket接口
public LoginThread(Socket socket){
this.socket = socket;
}
//启动线程,即响应客户请求
public void run(){
try {
//打开输入输出流
InputStream is = socket.getInputStream();
OutputStream os = socket.getOutputStream();
//反序列化
ObjectInputStream ois = new ObjectInputStream(is);
//获取客户端信息(从输入流读取信息)
User user = (User)ois.readObject();
if (!(user==null)) {
System.out.println("我是服务器端,客户登录信息为:\n用户名:"+user.getLoginName()+",密码:"+user.getPwd());
}
//给客户端一个响应(向输出流写入信息)
String reply = "欢迎你,登陆成功!";
os.write(reply.getBytes());
//关闭资源
os.close();
ois.close();
is.close();
socket.close();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
} }

2.服务器端的响应

 import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket; /**
* 服务器端关键代码
* @author Administrator
*
*/
public class Test0301 { public static void main(String[] args) {
try {
//创建一个服务器Socket(ServerSocket),指定端口并开始监听
@SuppressWarnings("resource")
ServerSocket serverSocket = new ServerSocket(8800);
//使用accpet()方法等待客户端触发通信
Socket socket = null;
while (true) {
//监听一直进行中
socket = serverSocket.accept();
LoginThread login = new LoginThread(socket);
login.start();
}
} catch (IOException e) {
e.printStackTrace();
} } }

3.客户登陆

 import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException; /**
* 实现多客户端用户登录
* @author Administrator
*
*/
public class Test03 { public static void main(String[] args) {
try {
//建立客户端Socket连接,指定服务器的位置和端口
Socket socket = new Socket("127.0.0.1",8800);
//打开输入输出流
OutputStream os = socket.getOutputStream();
InputStream is = socket.getInputStream();
//对象序列化
ObjectOutputStream oos = new ObjectOutputStream(os);
//发送客户端登录信息(向输出流写入数据)
User user = new User();
user.setLoginName("Kate");
user.setPwd("12345678");
oos.writeObject(user);
socket.shutdownOutput();
//接收服务器端的响应(从输入流读取信息)
String reply = null;
BufferedReader br = new BufferedReader(new InputStreamReader(is));
while(!((reply = br.readLine())==null)){
System.out.println("我是客户端,服务器端的响应为"+reply);
}
//关闭资源
br.close();
oos.close();
is.close();
os.close();
socket.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
} }

二、InetAddress类中的工厂方法

  static InetAddress getLocalHost();返回本地主机InetAddress对象

  static InetAddress getByName(String hostName);返回InetAddress对象

  static InetAddress[] getAllByName(String hostName);返回主机名~所有主机对象组

 import java.net.InetAddress;
import java.net.UnknownHostException; /**
* 获取淘宝网服务器地址
* @author Administrator
*
*/
public class Test002 { public static void main(String[] args) {
//定义目标网址
String target = "localhost";
System.out.println("------淘宝的主服务器地址------");
InetAddress iad;
try {
iad = InetAddress.getByName(target);
System.out.println(iad);
} catch (UnknownHostException e) {
e.printStackTrace();
} System.out.println("------淘宝的所有服务器地址------");
InetAddress[] iads;
try {
iads = InetAddress.getAllByName(target);
System.out.println(target+"的IP地址有"+iads.length+"个,分别是:");
for (InetAddress ia : iads) {
System.out.println(ia);
}
} catch (UnknownHostException e) {
e.printStackTrace();
} } }

初识Socket通信:基于TCP和UDP协议学习网络编程的更多相关文章

  1. 基于TCP与UDP协议的socket通信

    基于TCP与UDP协议的socket通信 C/S架构与初识socket 在开始socket介绍之前,得先知道一个Client端/服务端架构,也就是 C/S 架构,互联网中处处充满了 C/S 架构(Cl ...

  2. Python网络编程02 /基于TCP、UDP协议的socket简单的通信、字符串转bytes类型

    Python网络编程02 /基于TCP.UDP协议的socket简单的通信.字符串转bytes类型 目录 Python网络编程02 /基于TCP.UDP协议的socket简单的通信.字符串转bytes ...

  3. Java Socket实现基于TCP和UDP多线程通信

    一.通过Socket实现TCP编程 1.1 TCP编程 TCP协议是面向连接,可靠的,有序的,以字节流的方式发送数据.基于TCP协议实现网络通信的类有客户端的Socket类和服务器端的ServerSo ...

  4. Android中Socket通信之TCP与UDP传输原理

    一.Socket通信简介 Android与服务器的通信方式主要有两种,一是Http通信,一是Socket通信.两者的最大差异在于,http连接使用的是"请求-响应方式",即在请求时 ...

  5. 基于tcp和udp协议的套接字

    socket:是在应用层和传输层之间的一个抽象层,它把TCP/IP层的复杂的操作封装抽象,并提供一些接口供应用层调用 套接字:被设计用于同一台主机上多个应用程序之间的通信,被称为进程之间通信或IPC ...

  6. 东哥讲义2 - 基于TCP,UDP协议的攻击,分析与防护

    TCP SYN FLOOD 攻击 正常的TCP三次握手过程: 处于SYN FLOOD攻击状态时的三次握手过程: 查看示例:x_syn.c文件,一个实现了自定义mac,ip,tcp头部的syn floo ...

  7. [转]SOCKET通信中TCP、UDP数据包大小的确定

    TCP.UDP数据包大小的确定 UDP和TCP协议利用端口号实现多项应用同时发送和接收数据.数据通过源端口发送出去,通过目标端口接收.有的网络应用只能使用预留或注册的静态端口:而另外一些网络应用则可以 ...

  8. 移动网络应用开发中,使用 HTTP 协议比起使用 socket 实现基于 TCP 的自定义协议有哪些优势?

    HTTP 是应用层协议,TCP 是传输层协议(位于应用层之下),放在一起类比并不合适.不过猜测楼主是想对比 “标准 HTTP 协议” 还是 “自定义的协议(基于 TCP Socket)” . 一般来说 ...

  9. 基于UDP协议的网络编程

    UDP协议是一种不可靠的网络协议,它在通信实例的两端各建立一个Socket,但这两个Socket之间并没有虚拟链路,这两个Socket只是发送.接收数据报的对象. Java使用DatagramSock ...

随机推荐

  1. python 安装虚拟环境步骤

    1.python3.6.3 注: 1.安装的时候,装上你的pip 2.安装的时候,把环境变量记得勾选 3.如果你手动更改安装位置,更改到随意的盘根目录下 2.MySQL      pycharm最好安 ...

  2. 2018数学建模A题优秀论文:高温作业专用服装设计

    高温作业专用服装设计 摘 要 本文针对多层材料的高温作业服装的传热问题进行研究,综合考虑多种传热方式建立传热模型,并以此模型为基础解决了服装设计中各层材料最佳厚度的问题. 对于问题一,要求在热物性系数 ...

  3. 老男孩Day16作业:登录、注册、后台管理页面(动态)

    一.作业需求: 1.后台管理主界面(左边菜单框.(全选.反选)框.返回顶部按钮) 2.老男孩登录.注册页面 二.博客地址:https://www.cnblogs.com/catepython/p/93 ...

  4. SDUT OJ 数据结构上机测试1:顺序表的应用

    数据结构上机测试1:顺序表的应用 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Discuss Problem Descri ...

  5. [CQOI2007]涂色 BZOJ 1260 区间dp

    题目描述 假设你有一条长度为5的木版,初始时没有涂过任何颜色.你希望把它的5个单位长度分别涂上红.绿.蓝.绿.红色,用一个长度为5的字符串表示这个目标:RGBGR. 每次你可以把一段连续的木版涂成一个 ...

  6. PHP生成pdf文档

    首先需要去github下载tcpdf类库 require_once('./tcpdf/tcpdf.php');         date_default_timezone_get('Asia/Shan ...

  7. 网址访问量统计插件 FlagCounter

    网址或博客访问量统计插件  ---> FlagCounter. 网址:http://s01.flagcounter.com/more/ERP2/

  8. Android newsClient 小实例应用

    1.newsClient新闻客户端涉及知识点汇总: (1)ListView(用来显示消息) (2)开子线程去服务器取数据 (3)解析xml文件 (4)利用handler或者runOnUiThread( ...

  9. Android Toast语句应用

    1.findViewById()函数使用 函数作用:通过id来找到前台界面的组件 2.Toast语句 (1)介绍 (2)用法 (3)代码示例 package com.lucky.test21; imp ...

  10. Nginx负载均衡详解

     upstream mysvr {  server 192.168.10.121:3333; server 192.168.10.122:3333; } server { .... location ...