OSI参考模型中数据封装过程
TCP/IP协议族分为四层
网络编程的目的:
**网络通信的要素**IP地址,端口号,传输协议
强调:客户端和服务端进行数据传输时,客户端的输入流对应服务端的输出流,客户端的输出流对应服务端的输入流。
基于TCP协议的Socket编程
例子:实现一个客户端和服务端的交换
服务端
package cn.com.jlu.tcpsocket;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class TCPServer {
/**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
//创建一个ServerSocket,调用含有一个参数的构造方法,自定义一个端口号
ServerSocket serverSocket=new ServerSocket(8887);
//调用ServerSocket的accept方法,获取客户端传过来的请求
Socket socket=serverSocket.accept();
//连接开始getInetAddress()获取socket连接地址;getHostAddress()返回 IP 地址字符串
System.out.println(socket.getInetAddress().getHostAddress()+" has Connected!");
//读取客户端传过来的内容,将字节流转换为字符流
BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream()));
//将服务端的内容写回到客户端
PrintWriter pw=new PrintWriter(socket.getOutputStream());
String line=null;
while((line=br.readLine())!=null )
{
if(line.equals("over"))
{
break;
}
System.out.println(line);
//将客户端传来的内容大写,再传回去
pw.println(line.toUpperCase());
}
//一次关闭资源
pw.close();
br.close();
serverSocket.close();
//输出断开连接
System.out.println(socket.getInetAddress().getHostAddress()+" has Disconnected!");
}
}
客户端基于TCP
package cn.com.jlu.tcpsocket;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
public class TCPClient {
/**
* @param args
* @throws IOException
* @throws UnknownHostException
*/
public static void main(String[] args) throws UnknownHostException, IOException {
//1.创建一个Socket类,调用含有两个参数的构造方法IP和端口号(应用程序的逻辑地址)
Socket socket=new Socket("127.0.0.1", 8887);
//读取键盘输入的内容
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
//从socket中获取IO流
//将键盘输入的内容写到服务端
PrintWriter pw=new PrintWriter(socket.getOutputStream());
//获取到服务端传来的内容
BufferedReader reader=new BufferedReader(new InputStreamReader(socket.getInputStream()));
while(true)
{
//按行读取键盘输入的内容
String line=br.readLine();
pw.println(line);
//如果键入over,则停止运行
if(line.equals("over"))
{
break;
}
//将客户端传过来的内容按行读取
System.out.println(reader.readLine());
}
//关闭资源
pw.close();
br.close();
reader.close();
}
}