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) {}
        
    }
    
    }

 

posted @ 2018-11-05 19:33  米兰达儿  阅读(1296)  评论(0编辑  收藏  举报