初识Socket通信:基于TCP和UDP协议学习网络编程
学习笔记:
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协议学习网络编程的更多相关文章
- 基于TCP与UDP协议的socket通信
基于TCP与UDP协议的socket通信 C/S架构与初识socket 在开始socket介绍之前,得先知道一个Client端/服务端架构,也就是 C/S 架构,互联网中处处充满了 C/S 架构(Cl ...
- Python网络编程02 /基于TCP、UDP协议的socket简单的通信、字符串转bytes类型
Python网络编程02 /基于TCP.UDP协议的socket简单的通信.字符串转bytes类型 目录 Python网络编程02 /基于TCP.UDP协议的socket简单的通信.字符串转bytes ...
- Java Socket实现基于TCP和UDP多线程通信
一.通过Socket实现TCP编程 1.1 TCP编程 TCP协议是面向连接,可靠的,有序的,以字节流的方式发送数据.基于TCP协议实现网络通信的类有客户端的Socket类和服务器端的ServerSo ...
- Android中Socket通信之TCP与UDP传输原理
一.Socket通信简介 Android与服务器的通信方式主要有两种,一是Http通信,一是Socket通信.两者的最大差异在于,http连接使用的是"请求-响应方式",即在请求时 ...
- 基于tcp和udp协议的套接字
socket:是在应用层和传输层之间的一个抽象层,它把TCP/IP层的复杂的操作封装抽象,并提供一些接口供应用层调用 套接字:被设计用于同一台主机上多个应用程序之间的通信,被称为进程之间通信或IPC ...
- 东哥讲义2 - 基于TCP,UDP协议的攻击,分析与防护
TCP SYN FLOOD 攻击 正常的TCP三次握手过程: 处于SYN FLOOD攻击状态时的三次握手过程: 查看示例:x_syn.c文件,一个实现了自定义mac,ip,tcp头部的syn floo ...
- [转]SOCKET通信中TCP、UDP数据包大小的确定
TCP.UDP数据包大小的确定 UDP和TCP协议利用端口号实现多项应用同时发送和接收数据.数据通过源端口发送出去,通过目标端口接收.有的网络应用只能使用预留或注册的静态端口:而另外一些网络应用则可以 ...
- 移动网络应用开发中,使用 HTTP 协议比起使用 socket 实现基于 TCP 的自定义协议有哪些优势?
HTTP 是应用层协议,TCP 是传输层协议(位于应用层之下),放在一起类比并不合适.不过猜测楼主是想对比 “标准 HTTP 协议” 还是 “自定义的协议(基于 TCP Socket)” . 一般来说 ...
- 基于UDP协议的网络编程
UDP协议是一种不可靠的网络协议,它在通信实例的两端各建立一个Socket,但这两个Socket之间并没有虚拟链路,这两个Socket只是发送.接收数据报的对象. Java使用DatagramSock ...
随机推荐
- 【bzoj1066】: [SCOI2007]蜥蜴 图论-最大流
[bzoj1066]: [SCOI2007]蜥蜴 把石柱拆点,流量为高度 然后S与蜥蜴连流量1的边 互相能跳到的石柱连inf的边 石柱能到边界外的和T连inf的边 然后跑dinic就好了 /* htt ...
- mysql设计-优化
mysql表复制 1.复制表结构 create table student like user; 2.复制表内容 insert into t3 select * from t1; mysql索引 1. ...
- loj #535. 「LibreOJ Round #6」花火 树状数组求逆序对+主席树二维数点+整体二分
$ \color{#0066ff}{ 题目描述 }$ 「Hanabi, hanabi--」 一听说祭典上没有烟火,Karen 一脸沮丧. 「有的哦-- 虽然比不上大型烟花就是了.」 还好 Shinob ...
- Python第四次作业
设计题1: 设计一个本月份日历,输出格式如下: 要求: 1.初始化start_day,end_day两个日期 from datetime import datetime start_day=datet ...
- 静态库(.a)与动态库(.so)的简明介绍
静态库(.a)与动态库(.so)的简明介绍 gcc有很多关于静态库,动态库的选项如-l,-L,-fPIC,-shared -Wl,-soname,看着很复杂容易混淆,其实静态库和动态库都是应需而生,只 ...
- 【离散数学】SDUT OJ 补图
补图 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Problem Description 题目给出一个无向图,求该无向图关 ...
- PC站与H5移动站最佳适配方案
HTML5是目前HTML的最屌版本,同时也是建设移动站的最佳技术.百度适时推出PC站与H5移动站的最佳适配方案,对站长而言实在是久旱逢甘霖.详情如下: PC站与H5移动站最佳适配方案 pc端: 在pc ...
- javascript的代码块
a block of code 注意到这个问题是在看书的时候,中文版中出现“代码片段”这样的词语,于是就去翻看了英文版的原书.书中的用了a block of code,难道不应该翻译成代码块吗?(作为 ...
- 解析图书 XML
Java代码: package com.thinkgem.jeesite.test; import org.dom4j.Attribute; import org.dom4j.Document; im ...
- Java过滤器详细文档,简介,实例,应用
简介 Filter也称之为过滤器,它是Servlet技术中最激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 ...