网络编程:
1.什么是网络编程
连接到外面的世界
程序1———程序2
2.网络编程/网站编程
Login.jsp—–网络协议——tomcat——–LoginServlet
Java.net包
网络协议
7层模型
4层模型
TCP:传输控制协议,可靠连接(eg:打电话)
UDP:不可靠连接(eg:发短信)
IP:网络协议,提供了唯一的IP地址
网络编程:QQ通信
程序1————程序2
Ip (qq) ip(qq)
3.端口
程序在机器上的地址
4.套接字
套接字=ip+端口
5.网络编程的实现
a.客户端和服务器端传递信息
package client;
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 Client_1 {
public static void main(String[] args) {
try {
//指定套接字
Socket client = new Socket("127.0.0.1",5000);
//向服务器发送东西:本质上是流的操作
PrintWriter pw = new PrintWriter(client.getOutputStream());
String msg = "我是客户端";
pw.println(msg);
pw.flush();
//pw.close();
//客户端接收东西
BufferedReader br = new BufferedReader(new InputStreamReader(client.getInputStream()));
String msg1 = br.readLine();//等待服务器端的\n
System.out.println("客户端接收到的信息:"+msg1);
br.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
package server;
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 server_1 {
public static void main(String[] args) {
try {
ServerSocket server = new ServerSocket(5000);
while(true) {
//侦听并接收此套接字的连接,在此方法在连接传入之前一直阻塞
//server一直在监听是否有连接到来,阻塞态,不能继续往下走
//这个方法监听到有连接到来的时候
//这个方法就可以往下执行,返回一个socket处理连接
Socket socketServer = server.accept();
//已有客户端连接上来,socketServer来处理连接
BufferedReader br = new BufferedReader(new InputStreamReader(socketServer.getInputStream()));
String msg = br.readLine();//server等待客户端\n
System.out.println("服务器端得到的信息是:"+msg);
//br.close();
//服务器端返回东西
PrintWriter pr = new PrintWriter(socketServer.getOutputStream());
//String msg = "我是服务器端";
pr.println(msg);
pr.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
b.登录的实现
package client;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
import domain.User;
/**
* 界面--service--dao(就应练到服务器去验证)
*
* @author Administrator
*
*/
public class LoginClient {
public static void main(String[] args) {
try {
Socket socket = new Socket("127.0.0.1", 5000);
//界面
User user = new User();
user.setName("test");
//发送user到服务器--对象序列化
ObjectOutputStream out = new ObjectOutputStream(socket.getOutputStream());
out.writeObject(user);
out.flush();
//接收服务器结果
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String msg = br.readLine();
System.out.println("登录结果是:"+msg);
br.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
package server;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import domain.User;
public class LoginServer {
public static void main(String[] args) {
try {
ServerSocket server = new ServerSocket(5000);
while(true) {
Socket socket = server.accept();
//验证登录:得到客户端传递的User对象
ObjectInputStream oin = new ObjectInputStream(socket.getInputStream());
User user = (User) oin.readObject();
//---service层/dao层
//验证信息返回要返回客户端
String msg = "登录失败";
if("test".equals(user.getName())) {
msg = "登录成功";
}
PrintWriter pw = new PrintWriter(socket.getOutputStream());
pw.println(msg);
pw.close();
}
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
package domain;
import java.io.Serializable;
public class User implements Serializable{
/**
*
*/
private static final long serialVersionUID = 1L;
private int id;
private String name;
private String password;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public User(int id, String name, String password) {
this.id = id;
this.name = name;
this.password = password;
}
public User() {
super();
}
}
c.文件的上传
客户端想服务器端上传文件
package client;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket;
public class Client_2 {
public static void main(String[] args) throws Exception
{
//建立Socket服务
Socket fileLoaderSocket = new Socket("127.0.0.1", 5000);
//从客户端本地读取文件,并写入socket的输出流中
OutputStream out = fileLoaderSocket.getOutputStream();
//实例化对象fileReader
InputStream fileRead = new FileInputStream("F:\\学习计划\\学习计划.jpg");
//建立数组
byte[] buf = new byte[1024];
int len = 0;
//判断是否读到文件末尾
while((len=fileRead.read(buf)) != -1)
{
out.write(buf, 0, len);
}
//告诉服务端,文件已传输完毕
fileLoaderSocket.shutdownOutput();
//获取从服务端反馈的信息
BufferedReader in = new BufferedReader(new InputStreamReader(fileLoaderSocket.getInputStream()));
String serverBack = in.readLine();
System.out.println(serverBack);
//资源关闭
fileLoaderSocket.close();
fileRead.close();
}
}
package server;
import java.io.BufferedWriter;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class Server_2 {
public static void main(String[] args) throws Exception
{
//建立服务端Socket
ServerSocket ss = new ServerSocket(5000);
//接收客户端Socket
Socket fileLoaderSocket = ss.accept();
//打印连接信息
String ip = fileLoaderSocket.getInetAddress().getHostAddress();
System.out.println(ip + "...conncected");
//接收文件,并保存
InputStream in = fileLoaderSocket.getInputStream();
//实例化对象fileSave
OutputStream fileSave = new FileOutputStream("F:\\\\学习计划.jpg");
//建立数组buf
byte[] buf = new byte[1024];
int len = 0;
//判断是否读到文件末尾
while((len=in.read(buf)) != -1)
{
fileSave.write(buf, 0, len);
//刷新
fileSave.flush();
}
//返回文件复制情况信息
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(fileLoaderSocket.getOutputStream()));
out.write("文件上传成功");
//刷新
out.flush();
//资源关闭
ss.close();
fileLoaderSocket.close();
fileSave.close();
}
}
d.连接到外面的世界
package sockettest;
import java.io.IOException;
import java.io.InputStream;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.util.Scanner;
public class SocketTest {
public static void main(String[] args) {
try {
//1.建立一个套接字,连接给定的主机和端口,类似telnet访问
Socket s = new Socket();
s.connect(new InetSocketAddress("lsxk.org", 23), 10000);
//在控制台打印socket获得的流
InputStream inStream = s.getInputStream();//返回InputStream对象
Scanner in = new Scanner(inStream);
while(in.hasNextLine()) {
String line = in.nextLine();
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
请关注“知了堂学习社区”,地址:http://www.zhiliaotang.com/portal.php