一:网络通信的三要素?
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) {}
}
}