首页 > 编程语言 >网络编程

网络编程

时间:2023-03-06 21:01:16浏览次数:36  
标签:java Socket 编程 网络 new import 客户端 socket

网络编程

网络编程的三个要素

1、IP地址或主机名

  InetAddress

  String:192.168.24.71  每一个整数是1~255

  域名:www.baidu.com  通过域名解析器,找对对应的ip地址

2、端口号

  0~65535

  建议不要使用

    0~1023  用于基础服务

    tomcat/jboss  8080

    mysql  3306

    oracle  1521

    sql server  1433

    浏览器:http  80  

3、网络协议

  OSI理想参考模型

 

   TCP/IP的四层实现模式

  传输层

    TCP

      面向连接的,可靠的,适用于大数据传输,速率相对低,在传输之前会先“三次握手”,在断开之前会“四次挥手”

    UDP

      非面向连接的,不可靠的,适用于数据比较小的,<=64kb,相对速率高

  应用层

    http/https

    ftp

网络编程的API

Socket

  套接字  表示通信的两个端点,两边各一个

  分类  

    流套接字  用于TCP通信

      ServerSocket  转门用于服务器用来监听和接收客户端的连接

      Socket  用于服务器和客户端的通信

    数据报套接字   用于UDP的通信

        DatagramSocket  用于UDP的两端的通信

TCP编程步骤

  服务器

    1、先创建ServerSocket

      ServerSocket server = new ServerSocket(端口号);

      指定端口号进行监听,客户端通过这个端口号与它进行连接和通信

    2、接收客户端的连接

      Socket socket = server.accept();

      每一个客户端就要有自己的一个Socket

      如果希望不同的客户端通信“同时”进行,需要每一个socket用一个线程进行维护

    3、通过socket进行收或发消息

      收消息  InputStream is = socket.getInputStream();

        可以在此基础上,包装缓冲流,转换流,对象流,打印流,数据流等

      发消息  OutputStream out = socket.getOutputStream();

        可以在此基础上,包装缓冲流,转换流,对象流,打印流,数据流等

    4、与客户端断开连接  socket.close();

  客户端

    1、先与服务器建立连接,通过创建一个Socket,要指定服务器的IP和端口号

      Socket socket = new Socket(服务器的IP,服务器的监听端口号);

    2、通过socket进行收或发消息

      收消息  InputStream is = socket.getInputStream();

        可以在此基础上,包装缓冲流,转换流,对象流,打印流,数据流等

      发消息  OutputStream out = socket.getOutputStream();

        可以在此基础上,包装缓冲流,转换流,对象流,打印流,数据流等

      收和发可以用不同的线程进行维护

    3、与客户端断开连接  socket.close();

//示例一
package com.atguigu.tcp1;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import org.junit.Test;
/*
 * TCP:面向连接
 * 通信的两端分角色:服务器端和客户端
 * 
 * 服务器端等着被连接,客户端主动连接
 * 
 * 服务器端:
 * 1、ServerSocket:用来接收客户端的连接信息
 * 2、Socket:用来与某个客户端进行通信
 * 
 * 客户端:
 * 1、Socket:用来与服务器进行通信
 * 
 */
public class TestTCP1 {
    @Test
    public void server()throws Exception{
        //1、创建ServerSocket,看成:开启服务器 ,需要指定一个端口号,监听是否有客户端来连接
        ServerSocket ss = new ServerSocket(9090);
        
        while(true){
            System.out.println("等待您的链接....");
            //2、等待客户端的连接,接收客户端的连接(如果没有人连接,那么这句代码会阻塞)
            //一旦有客户端连接成功,那么就会产生一个Socket对象,专门负责和这个客户端通信
            Socket socket = ss.accept();
            
            System.out.println(socket.getInetAddress().getHostAddress()+"连接成功");
            
            //3、可以接收消息,或发生消息
            //例如:先发:“欢迎登陆”
            //在接收消息
            
            //发消息:输出流,OutputStream
            OutputStream output = socket.getOutputStream();
            output.write("欢迎登陆".getBytes());
            socket.shutdownOutput();
            
            //收消息
            InputStream is = socket.getInputStream();
            
            byte[] data = new byte[1024];
            int len;
            StringBuilder sb = new StringBuilder();
            while((len= is.read(data)) !=-1){
                sb.append(new String(data,0,len));
            }
            System.out.println("服务器收到的消息:" + sb);
            
            //4、关闭连接
            socket.close();//只是与某个客户端断开
        }
        
        //5、服务器关闭
//        ss.close();
    }
    
    @Test
    public void client()throws Exception{
        //1、创建一个Socket,要指定服务器的IP和端口号
        Socket socket = new Socket("192.168.24.71",9090);
        
        //2、接收消息
        InputStream is = socket.getInputStream();
        
        byte[] data = new byte[1024];
        int len;
        StringBuilder sb = new StringBuilder();
        while((len= is.read(data)) !=-1){
            sb.append(new String(data,0,len));
        }
        System.out.println("客户端收到的消息:" + sb);
        
        //3、发送消息
        String info = "马上吃饭了";
        OutputStream out = socket.getOutputStream();
        out.write(info.getBytes());
        
        //3、关闭连接
        socket.close();
    }
}
//示例二
package com.atguigu.tcp2;
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;
import java.util.Scanner;
import org.junit.Test;
public class TestTCP2 {
    @Test
    public void server()throws Exception{
        //1、创建ServerSocket
        ServerSocket server = new ServerSocket(9999);
        
        while(true){
            //2、等待客户端的连接,接收客户端的连接
            Socket socket = server.accept();
            String clientIp = socket.getInetAddress().getHostAddress();
            
            System.out.println(clientIp+"上线了");
            
            //每一个客户端需要一个线程单独维护它的通信,“同时”与服务器通信的效果
            new MessageHandler(socket).start();
        }
    }
    
    //和服务器连接上以后,从键盘输入消息,给服务器发送,一直到从键盘输入byebye,在与服务端口连接
    @Test
    public void client()throws Exception{
        //1、连接服务器
        Socket socket = new Socket("192.168.24.71",9999);
        
        OutputStream out = socket.getOutputStream();
        
        //2,从键盘输入给服务器发送
        Scanner input = new Scanner(System.in);
        while(true){
            System.out.println("输入要发送的内容:");
            String info = input.nextLine();
            
            if("byebye".equals(info)){
                break;
            }
            
            //给服务器发送
            out.write((info+"\n").getBytes());
        }
        
        //3、断开
        socket.close();
    }
}
class MessageHandler extends Thread{
    private Socket socket;
    
    public MessageHandler(Socket socket) {
        super();
        this.socket = socket;
    }
    public void run(){
        try {
            //3、和一个客户端多次通信,接收到消息后,在控制台打印
            InputStream input = socket.getInputStream();
            InputStreamReader isr = new InputStreamReader(input);
            BufferedReader br = new BufferedReader(isr);
            
            String str;
            while((str = br.readLine())!=null){
                System.out.println(socket.getInetAddress().getHostAddress() +"说:"+ str);
            }
            
            //4、断开
            socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
//示例三
//服务器
package com.atguigu.tcp2;
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;
import java.util.Scanner;
import org.junit.Test;
public class TestTCP2 {
    @Test
    public void server()throws Exception{
        //1、创建ServerSocket
        ServerSocket server = new ServerSocket(9999);
        
        while(true){
            //2、等待客户端的连接,接收客户端的连接
            Socket socket = server.accept();
            String clientIp = socket.getInetAddress().getHostAddress();
            
            System.out.println(clientIp+"上线了");
            
            //每一个客户端需要一个线程单独维护它的通信,“同时”与服务器通信的效果
            new MessageHandler(socket).start();
        }
    }
    
    //和服务器连接上以后,从键盘输入消息,给服务器发送,一直到从键盘输入byebye,在与服务端口连接
    @Test
    public void client()throws Exception{
        //1、连接服务器
        Socket socket = new Socket("192.168.24.71",9999);
        
        OutputStream out = socket.getOutputStream();
        
        //2,从键盘输入给服务器发送
        Scanner input = new Scanner(System.in);
        while(true){
            System.out.println("输入要发送的内容:");
            String info = input.nextLine();
            
            if("byebye".equals(info)){
                break;
            }
            
            //给服务器发送
            out.write((info+"\n").getBytes());
        }
        
        //3、断开
        socket.close();
    }
}
class MessageHandler extends Thread{
    private Socket socket;
    
    public MessageHandler(Socket socket) {
        super();
        this.socket = socket;
    }
    public void run(){
        try {
            //3、和一个客户端多次通信,接收到消息后,在控制台打印
            InputStream input = socket.getInputStream();
            InputStreamReader isr = new InputStreamReader(input);
            BufferedReader br = new BufferedReader(isr);
            
            String str;
            while((str = br.readLine())!=null){
                System.out.println(socket.getInetAddress().getHostAddress() +"说:"+ str);
            }
            
            //4、断开
            socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

//客户端
package com.atguigu.tcp3;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.Socket;
import java.net.SocketException;
import java.util.Scanner;
/*
 * 
 */
public class TestTCPClient{
    public static void main(String[] args) throws Exception{
        //1、连接服务器
        Socket socket = new Socket("192.168.24.71",9090);
        
        //2、创建两个线程,一个收,一个发
        SendThread send = new SendThread(socket);
        send.start();
        RecevierThread r = new RecevierThread(socket);
        r.start();
        
        send.join();
        
        r.setExit(true);
        
        //3、关闭
        socket.close();
    }
}
class SendThread extends Thread{
    private Socket socket;
    
    public SendThread(Socket socket) {
        super();
        this.socket = socket;
    }
    @Override
    public void run() {
        try {
            OutputStream output = socket.getOutputStream();
            PrintStream ps = new PrintStream(output);
            
            Scanner input = new Scanner(System.in);
            while(true){
                System.out.println("请输入要发送的内容:");
                String info = input.nextLine();
                if("bye".equals(info)){
                    break;
                }
                //给服务器发送
                ps.println(info);
            }
            
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
class RecevierThread extends Thread{
    private Socket socket;
    private boolean exit = false;
    
    public RecevierThread(Socket socket) {
        super();
        this.socket = socket;
    }
    @Override
    public void run() {
        try {
            InputStream is = socket.getInputStream();
            InputStreamReader isr = new InputStreamReader(is);
            BufferedReader br = new BufferedReader(isr);
            
            String str;
            while(exit==false){
                try {
                    str = br.readLine();
                } catch (SocketException e) {
                    break;
                }
                if(str==null){
                    break;
                }
                System.out.println("收到的消息:" + str);
            }
            
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public void setExit(boolean exit) {
        this.exit = exit;
    }
    
}

 

标签:java,Socket,编程,网络,new,import,客户端,socket
From: https://www.cnblogs.com/woniupa/p/17183670.html

相关文章

  • Java实验-Swing 网络聊天室
    实验要求:综合Swing界面、多线程和Java的网络通信功能,实现仿QQ聊天:(1)界面设计如下:(2)要求在服务器端利用多线程响应客户端请求;//服务线程(内部类),用于处理客户端的服务线......
  • 函数编程:强大的 Stream API
    函数编程:强大的StreamAPI每博一文案只要有人的地方,世界就不会是冰冷的,我们可以平凡,但绝对不可以平庸。——————《......
  • 写 Python 代码不可不知的函数式编程技术
    把函数作为对象由于其他数据类型(如string、list和int)都是对象,那么函数也是Python中的对象。我们来看示例函数foo,它将自己的名称打印出来:deffoo():print("foo......
  • 函数式编程:Lambda 表达式
    函数式编程:Lambda表达式每博一文案曾经读过的依然令我感动的句子,生活总是不如意,但往往是在无数痛苦中,但往往是在无数痛苦中,在重重矛盾和艰难中才能成熟起来,坚强起来,爱......
  • 如果今天没有API接口,今天的程序员如何编程?
    这是一个非常有意思的问题,作为一名从业多年的程序员,我来回答一下这个问题。首先,接口是程序设计过程中最为常见的元素,不论是研发级程序员还是应用级程序员,在日常的编程过程中......
  • windows内核网络调试
    1windows网络调试2bcdedit/dbgsettingsnethostip:192.168.2.1port:500003Key=sfz54lfnnz7r.2qv9aiovadd5i.2gtkz3xamru32.cdwwl45caxfl456bcdedit/set{......
  • 网络流
    \(EK(Edmond—Karp)\)洛谷日报用最通俗的语言让你学会网络流模板:P3376【模板】网络最大流点击查看代码```//EK#include#definecsconst#defineilinline#def......
  • 网络安全(中职组)-B模块:Windows操作系统渗透测试
    任务环境说明:服务器场景:teltest服务器场景操作系统:Windows7(封闭靶机)1.通过本地PC中渗透测试平台Kali对服务器场景Windows进行系统服务及版本扫描渗透测试,并将该作显示......
  • 你也能成为“黑客”高手——趣谈Linux Shell编程语言
    作者:京东零售杜兴文我们看过很多在电脑命令行敲一些命令并给观众展示很高科技的画面感的电影,比如《盗梦空间》《操作系统革命》《代码》等等,再想想电影黑客帝国中的画面......
  • 序章 高质量C++/C编程指南
    一、文件结构避免头文件被重复引用,用#pragmaonce进行预处理用<>引用标注库头文件,用""引用自定义库头文件C语言头文件只进行函数声明,不进行函数定义;C++类的成员......