初识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 ...
随机推荐
- shell和matlab之间的参数传递
shell和matlab之间的参数传递比shell和Python之间的参数传递要简单,在matlab程序中(以.m脚本文件为例,其他程序如函数等未测试)不需要进行任何配置,直接使用即可,见下面 ...
- 如何删除/mnt/cdrom?|如何删除只读文件系统(Read-only files ystem)? failed !bh ? 挂载光盘?挂载usb?
root权限下 : 首先用umount /mnt/文件夹 卸载文件系统,必要时可以用umount -f(可能丢失数据)然后rm -rf /mnt/cdrom mkdir /mnt/cdrom moun ...
- 伪元素改变date类型input框的默认样式实例页面
CSS代码: ::-webkit-datetime-edit { padding: 1px; background: url(/study/image/selection.gif); } ::-web ...
- c++11中关于`std::thread`线程传参的思考
关于std::thread线程传参的思考 最重要要记住的一点是:参数要拷贝到线程独立内存中,不管是普通类型.还是引用类型. 对于传递参数是引用类型,需要注意: 1.当指向动态变量的指针(char *) ...
- mysql主从复制简单配置,满满的干货
mysql主从备份(复制)的基本原理 mysql支持单向.异步复制,复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器.mysql复制基于主服务器在二进制日志中跟踪所有对数据库的更改 ...
- 50个php程序性能优化的方法,赶紧收藏吧!
1. 用单引号代替双引号来包含字符串,这样做会更快一些.因为 PHP 会在双引号包围的 字符串中搜寻变量,单引号则不会,注意:只有 echo 能这么做,它是一种可以把多个字符 串当作参数的“函数”(译 ...
- Linux下指定线程的名字
为了能方便的区分一个进程中的每个线程,可以通过prctl()给每个线程取个名字.这样在会创建多个线程的程序执行过程中,就能知道一个pid或tid对应的是哪个线程,对调试程序有一定帮助. prctl是个 ...
- Ubuntu上使用systemd创建服务文件来启动和监视底层网络应用程序实现守护进程
在Linux上使用Nginx设置ASP.NET Core的托管环境,并部署到它 创建服务文件 创建服务定义文件: sudo vim /etc/systemd/system/kestrel-basic. ...
- perl中一些模块的ubuntu中依赖包
GD 先更新系统中的依赖包: sudo apt-get update sudo apt-get upgrade 进入 cpan> install GD 会提示没有安装libgd模块. 所以,先需 ...
- 113th LeetCode Weekly Contest Largest Time for Given Digits
Given an array of 4 digits, return the largest 24 hour time that can be made. The smallest 24 hour t ...