Java 网络编程

来源:互联网 发布:设计app软件 编辑:程序博客网 时间:2024/05/22 05:22

基于TCP协议下的网络编程:


获取本地主机地址

import java.net.InetAddress;import java.net.UnknownHostException;/** * 测试InetAddress类 * @author 30869 * */public class Test_InetAddress {public static void main(String[] args) {try {InetAddress address=InetAddress.getLocalHost();//获取表示本地主机的InetAddress对象System.out.println("本地主机地址是:"+address);} catch (UnknownHostException 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客户端 * @author 30869 * */public class TestSocket {public static void main(String[] args) throws UnknownHostException, IOException {Socket socket=new Socket("localhost", 8800);//创建客户端Socket连接,指定服务器的位置为本机和8800端口InputStream is=socket.getInputStream();//打开输入/输出流OutputStream os=socket.getOutputStream();String info="用户名:李林,密码: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);}is.close();//关闭资源os.close();socket.close();br.close();}}
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;/** * 测试ServerSocket服务器端 * @author 30869 * */public class TestServerSocket {public static void main(String[] args) throws IOException {ServerSocket serverSocket=new ServerSocket(8800);//建立一个服务器Socket(ServerSocket),指定端口8800并开始监听Socket socket=serverSocket.accept();//等待客户端触发通信InputStream is=socket.getInputStream();//打开输入输出流OutputStream os=socket.getOutputStream();String info=null;//获取客户端信息,即从输入流读取信息//InputStreamReader()转换流,字节转字符BufferedReader br=new BufferedReader(new InputStreamReader(is));while(!((info=br.readLine())==null)){System.out.println("我是服务器,客户登录信息为:"+info);}String reply="欢迎你,登录成功!";//给客户端一个响应,即从输出流写入信息os.write(reply.getBytes());serverSocket.close();//关闭资源socket.close();is.close();os.close();br.close();}}

传输对象

import java.io.Serializable;/** * 序列化用户类 * @author 30869 * */public class User implements Serializable{private String uName;//用户名private String pwd;//密码public User() {super();}public User(String uName, String pwd) {super();this.uName = uName;this.pwd = pwd;}public String getuName() {return uName;}public void setuName(String uName) {this.uName = uName;}public String getPwd() {return pwd;}public void setPwd(String pwd) {this.pwd = pwd;}}
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;import java.util.ArrayList;import java.util.List;/** * 客户端 * @author 30869 * */public class Client {public static void main(String[] args) throws UnknownHostException, IOException {Socket socket=new Socket("localhost", 8800);//建立客户端Socket连接,指定服务器位置和端口OutputStream os=socket.getOutputStream();//打开输入/输出流InputStream is=socket.getInputStream();ObjectOutputStream oos=new ObjectOutputStream(os);//对象序列化List<User> users=new ArrayList<User>();//添加对象数据users.add(new User("李林", "123456"));users.add(new User("杨英", "654321"));users.add(new User("周星驰", "158312"));users.add(new User("叶问", "851236"));users.add(new User("李连杰", "741852"));oos.writeObject(users);//写入数据//禁用此套接字的输出流。对于 TCP 套接字,任何以前写入的数据都将被发送,并且后跟 TCP 的正常连接终止序列。//如果在套接字上调用 shutdownOutput() 后写入套接字输出流,则该流将抛出 IOExceptionsocket.shutdownOutput();BufferedReader br=new BufferedReader(new InputStreamReader(is));//读取服务器响应信息String reply=null;while(!((reply=br.readLine())==null)){System.out.println("我是客户端:服务器响应信息为:"+reply);}br.close();//关闭资源oos.close();os.close();is.close();socket.close();}}
import java.io.BufferedWriter;import java.io.IOException;import java.io.InputStream;import java.io.ObjectInputStream;import java.io.OutputStream;import java.io.OutputStreamWriter;import java.net.ServerSocket;import java.net.Socket;import java.util.ArrayList;import java.util.List;import com.lilin.testSocket_ServerSocket_Object.User;/** * 服务器端 *  * @author 30869 * */public class Server {public static void main(String[] args) throws IOException, ClassNotFoundException {ServerSocket serverSocket = new ServerSocket(8800);// 指定端口8800并开始监听Socket socket = serverSocket.accept();// 等待客户端触发通信InputStream is = socket.getInputStream();// 打开输入/输出流OutputStream os = socket.getOutputStream();ObjectInputStream ois = new ObjectInputStream(is);// 对象反序列化List<User> users = new ArrayList<User>();users = (List<User>) ois.readObject();// 读取客户端信息if (!(users == null)) {//先判断客户端是否发出请求System.out.println("我是服务器:客户端登录信息如下:");for (User user : users) {System.out.println("用户名:" + user.getuName() + "\t密码:" + user.getPwd());}}BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os));// 给客户端响应bw.write("登录人数:" + users.size() + "人");bw.close();// 关闭资源ois.close();os.close();is.close();socket.close();serverSocket.close();}}

多个客户端访问服务器

import java.io.Serializable;/** * 序列化用户类 * @author 30869 * */public class User implements Serializable{private String uName;//用户名private String pwd;//密码public User() {super();}public User(String uName, String pwd) {super();this.uName = uName;this.pwd = pwd;}public String getuName() {return uName;}public void setuName(String uName) {this.uName = uName;}public String getPwd() {return pwd;}public void setPwd(String pwd) {this.pwd = pwd;}}

import java.io.BufferedWriter;import java.io.IOException;import java.io.InputStream;import java.io.ObjectInputStream;import java.io.OutputStream;import java.io.OutputStreamWriter;import java.net.Socket;import java.util.ArrayList;import java.util.List;/** * 服务端线程 * @author 30869 * */import java.util.Scanner;public class LoginThread extends Thread {Socket socket = null;OutputStream os = null;InputStream is = null;ObjectInputStream ois = null;BufferedWriter bw = null;Scanner scanner=new Scanner(System.in);//每启动一个线程,连接对应的Socketpublic LoginThread(Socket socket) {super();this.socket = socket;}//启动线程,即响应客户端请求public void run() {try {os = socket.getOutputStream();is = socket.getInputStream();ois = new ObjectInputStream(is);List<User> users = new ArrayList<User>();users = (List<User>) ois.readObject();StringBuffer sb = new StringBuffer();//用于存储响应信息if (!(users == null)) {System.out.println("我是服务器:客户端请求信息如下:");for (User user : users) {System.out.println("用户名:" + user.getuName() + "\t密码" + user.getPwd());sb.append(user.getuName() + "已登录\n");}}bw = new BufferedWriter(new OutputStreamWriter(os));bw.write(sb.toString());} catch (Exception e) {e.printStackTrace();} finally {try {bw.close();ois.close();is.close();os.close();socket.close();} catch (IOException e) {e.printStackTrace();}}}}

import java.io.IOException;import java.net.ServerSocket;import java.net.Socket;/** * 服务器端 * @author 30869 * */public class Server {public static void main(String[] args) throws IOException {ServerSocket serverSocket=new ServerSocket(8800);//建立服务器Socket(SeverSocket),指定端口并开始监听Socket socket=null;//监听一直进行while(true){socket=serverSocket.accept();//等待客户端触发通信LoginThread loginThread=new LoginThread(socket);loginThread.start();}}}

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;import java.util.ArrayList;import java.util.List;/** * 客户端 * @author 30869 * */public class Client2 {public static void main(String[] args) throws UnknownHostException, IOException {Socket socket=new Socket("localhost", 8800);//建立客户端Socket连接,指定服务器位置和端口OutputStream os=socket.getOutputStream();//打开输入/输出流InputStream is=socket.getInputStream();ObjectOutputStream oos=new ObjectOutputStream(os);//对象序列化List<User> users=new ArrayList<User>();//添加对象数据users.add(new User("黎明", "123456"));users.add(new User("张学友", "654321"));users.add(new User("周星驰", "158312"));users.add(new User("刘德华", "851236"));users.add(new User("李连杰", "741852"));oos.writeObject(users);//写入数据//禁用此套接字的输出流。对于 TCP 套接字,任何以前写入的数据都将被发送,并且后跟 TCP 的正常连接终止序列。//如果在套接字上调用 shutdownOutput() 后写入套接字输出流,则该流将抛出 IOExceptionsocket.shutdownOutput();BufferedReader br=new BufferedReader(new InputStreamReader(is));//读取服务器响应信息String reply=null;System.out.println("我是客户端:服务器响应信息为:");while(!((reply=br.readLine())==null)){System.out.println(reply);}br.close();//关闭资源oos.close();os.close();is.close();socket.close();}}

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;import java.util.ArrayList;import java.util.List;/** * 客户端 * @author 30869 * */public class Client {public static void main(String[] args) throws UnknownHostException, IOException {Socket socket=new Socket("localhost", 8800);//建立客户端Socket连接,指定服务器位置和端口OutputStream os=socket.getOutputStream();//打开输入/输出流InputStream is=socket.getInputStream();ObjectOutputStream oos=new ObjectOutputStream(os);//对象序列化List<User> users=new ArrayList<User>();//添加对象数据users.add(new User("李林", "123456"));users.add(new User("杨英", "654321"));users.add(new User("周星驰", "158312"));users.add(new User("叶问", "851236"));users.add(new User("张学友", "741852"));oos.writeObject(users);//写入数据//禁用此套接字的输出流。对于 TCP 套接字,任何以前写入的数据都将被发送,并且后跟 TCP 的正常连接终止序列。//如果在套接字上调用 shutdownOutput() 后写入套接字输出流,则该流将抛出 IOExceptionsocket.shutdownOutput();BufferedReader br=new BufferedReader(new InputStreamReader(is));//读取服务器响应信息String reply=null;System.out.println("我是客户端:服务器响应信息为:");while(!((reply=br.readLine())==null)){System.out.println(reply);}br.close();//关闭资源oos.close();os.close();is.close();socket.close();}}

基于UDP协议的网络编程:

/** * 发送端 */import java.io.IOException;import java.net.DatagramPacket;import java.net.DatagramSocket;import java.net.InetAddress;import java.net.SocketException;import java.net.UnknownHostException;public class Send {public static void main(String[] args) {InetAddress ia=null;//主机地址引用DatagramSocket ds=null;//DatagramSocket引用String msgs="你好,哪位?";System.out.println("我说:"+msgs);//显示与本地对话框try {ia=InetAddress.getByName("localhost");//获取主机地址} catch (UnknownHostException e) {e.printStackTrace();}//创建DatagramPacket对象,封装数据DatagramPacket dp=new DatagramPacket(msgs.getBytes(), msgs.getBytes().length,ia,8800);try {ds=new DatagramSocket();//创建DatagramSocket对象} catch (SocketException e) {e.printStackTrace();}try {ds.send(dp);//向服务器发送数据} catch (IOException e) {e.printStackTrace();}//接收服务器响应byte[] buf=new byte[1024];DatagramPacket dprp=new DatagramPacket(buf, 1024);try {ds.receive(dprp);} catch (IOException e) {e.printStackTrace();}finally {ds.close();//关闭DatagramSocket对象}String reply=new String(dprp.getData(),0,dprp.getLength());//取出信息System.out.println(dp.getAddress().getHostAddress()+"说:"+reply);}}

import java.io.IOException;import java.net.DatagramPacket;import java.net.DatagramSocket;import java.net.SocketAddress;import java.net.SocketException;/** * 接收端 * @author 30869 * */public class Receive {public static void main(String[] args) {DatagramSocket ds=null;//创建DatagramSocket引用byte[] buf=new byte[1024];//创建DatagramPacket对象,用来准备接收数据包DatagramPacket dp=new DatagramPacket(buf, 1024);try {ds=new DatagramSocket(8800);//创建DatagramSocket对象,指定端口} catch (SocketException e) {e.printStackTrace();}try {ds.receive(dp);//接收数据,放入dp} catch (IOException e) {e.printStackTrace();}String msgs=new String(dp.getData(), 0, dp.getLength());//取出数据信息System.out.println(dp.getAddress().getHostAddress()+"说:"+msgs);//向客户端发送响应信息String reply="我是李林";System.out.println("我说:"+reply);//显示与本地对话框//SocketAddress类,供套接字用于绑定、连接或用作返回值//getSocketAddress(),获取要将此包发送到的或发出此数据报的远程主机的 SocketAddress(通常为 IP 地址 + 端口号)。SocketAddress sa=dp.getSocketAddress();//创建DatagramPacket对象,封装数据DatagramPacket dpto=new DatagramPacket(reply.getBytes(), reply.getBytes().length,sa);try {ds.send(dpto);//发送} catch (IOException e) {e.printStackTrace();}finally {ds.close();//关闭DatagramSocket对象}}}




原创粉丝点击