学习笔记:

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();
} } }

最新文章

  1. 求两条线段交点zz
  2. 怎样使用nat和桥接方式解决虚拟机联网问题
  3. 【转】sql里面的split
  4. gcd,lcm,ext_gcd,inv
  5. Codeforces Round #172 (Div. 2) B. Nearest Fraction 二分
  6. 分析BGARefreshLayout-master
  7. Nginx日志增长过快详细分析
  8. 箱型图boxplot函数的使用
  9. Centos7下安装MySql
  10. 1、js的基本对象和垃圾回收
  11. css清除浮动方式总结
  12. linux下tomcat服务器的相关命令
  13. 高并发编程基础(java.util.concurrent包常见类基础)
  14. CentOS 服务器添加简易"回收站"
  15. 【PAT】B1084 外观数列(20 分)(纯C)
  16. python 读csv文件时,在csv类型上执行类型转换
  17. busybox 安装问题解决
  18. C# Azure 设置云端应用程序的默认时间
  19. BugPhobia开发篇章:Beta阶段第V次Scrum Meeting
  20. 17、uwp 打包失败记录

热门文章

  1. mac下对NTFS格式的磁盘进行读写操作
  2. 190411Python面向对象编程
  3. KVO - 观察自定义属性值
  4. (STM32F4) External Interrupt
  5. tomcat更改web文件路径
  6. 最长上升子序列(LIS)的n*log(n)求法
  7. POJ1475 Pushing Boxes 华丽丽的双重BFS
  8. Trie - 20181113
  9. 带OUTPUT的增删改
  10. 盒子绝对定位 position:foxed ; 居中