Java中的基于Tcp协议的网络编程
一:网络通信的三要素?
IP地址 端口号 通信协议
IP地址:是网络中设备的通信地址。由于IP地址不易记忆,故可以使用主机名。本地环回地址,127.0.0.1 本地主机名localhost
端口号:发送端准备的数据要发送到指定的目的应用程序上,为了标识这些应用程序,所以用网络数字来标识这些不同的应用程序,这些数
字称为端口号。端口号是不同进程之间的标识。一般来说,有0~65535的端口可供使用,但是1~1024系统使用,或者称作保留端口。
通信协议:指定义的通信规则,这个规则称为协议。国际组织定义了通用TCP/IP协议。我们常见的通信协议有TCP 协议 UDP协议
二:Java中基于TCP协议的网络编程?
首先,我们需要了解TCP协议的一些基本特点:
TCP协议,是面向连接的可靠协议。在数据传输前,必须先建立双方的连接,所以说是面向连接的。在建立的连接中,可以进行大数据量的传输。而且,tcp协议通过三次握手完成连接,所以说是可靠的协议。同时,传输效率比较低。
接下来我们得清楚TCP协议下的网络编程的编程思路:
需要用到两个类:Socket(实现客户端套接字)和ServerSocket(实现服务器套接字)
客户端:
准备好要发送的数据包
创建客户端的套接字,与服务器端建立连接
调用Socket的方法来发送数据报包
关闭套接字
服务器端:
准备接收数据客户端建立连接
创建服务器的套接字,并且与客户端建立连接
调用ServerSocket的方法来接受数据
关闭套接字
三:实例如下
实现基本的客户端的与服务器之间的通信。
客户端代码:
package com.itycl.net; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.net.Socket; import java.net.UnknownHostException; public class TcpClientDemo1 { public static void main(String[] args) throws Exception { Socket s=new Socket("192.168.3.109",8833);//建立连接,绑定目的应用程序的IP地址和端口号 OutputStream oo=s.getOutputStream();//调用getOutputStream()来发送数据 BufferedWriter ow=new BufferedWriter(new OutputStreamWriter(oo));//把要发送的数据写到缓冲区 BufferedReader br=new BufferedReader(new InputStreamReader(System.in));//读取键盘中输入的数据 String line=null; while((line=br.readLine())!=null) { ow.write(line); ow.newLine(); ow.flush(); } } }
服务器端代码:
package com.itycl.net; 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; public class TcpServerDemo1 { public static void main(String[] args) throws Exception { ServerSocket ss=new ServerSocket(8833);//建立服务器端然套接字 Socket s=ss.accept();//调用accept方法接受并且监听连接 InputStream is=s.getInputStream();//调用getInputStream()来接收数据 BufferedReader br=new BufferedReader(new InputStreamReader(is)); String ip=s.getInetAddress().getHostAddress(); String line=null; while((line=br.readLine())!=null) { byte[] buf=line.getBytes(); String data=new String(buf,0,buf.length); System.out.println(ip +" : "+data); } } }
四.实现客户端与服务器的通信,并且将聊天记录保存在某个盘符下。
要求:可循环发送接收消息,并且保存的聊天记录中要有IP地址+时间+接收的数据,且,要求在一个Java文件中实现。
实例代码:
package com.itycl.net; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileWriter; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.net.ServerSocket; import java.net.Socket; import java.text.SimpleDateFormat; import java.util.Date; public class TcpClientAndServerDemo { public static void main(String[] args) { new Thread(new Client()).start(); try {Thread.sleep(30);}catch(Exception e) {} new Thread(new Server()).start(); } } class Client implements Runnable{ @Override public void run() { try { Socket s=new Socket("localhost",8962); OutputStream os = s.getOutputStream(); BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(os)); BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); String line=null; while((line=br.readLine())!=null) { byte[] buf=line.getBytes(); String data=new String(buf,0,buf.length); bw.write(data); bw.newLine(); bw.flush(); } bw.close(); }catch(Exception e) {} } } class Server implements Runnable{ @Override public void run() { try { ServerSocket ss=new ServerSocket(8962); Socket s = ss.accept(); InputStream is = s.getInputStream(); BufferedReader br=new BufferedReader(new InputStreamReader(is)); String line=null; while((line=br.readLine())!=null) { byte[] buf=line.getBytes(); String data=new String(buf,0,buf.length); String ip=s.getInetAddress().getHostAddress(); SimpleDateFormat sdft=new SimpleDateFormat("HH:MM:s");//格式化日期 Date date=new Date(); String format = sdft.format(date); System.out.println(ip+" : "+format+" : "+data);//输出数据 BufferedWriter bw=new BufferedWriter(new FileWriter("E://liaotianjilu.txt",true)); //将聊天记录保存到E盘 bw.write(ip+" : "+format+" : "+data); bw.newLine(); bw.flush(); } }catch(Exception e) {} } }