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

Java Socket网络编程

时间:2022-12-15 11:56:52浏览次数:52  
标签:Java Socket java 客户机 编程 io new import

1. TCP流式Socket

  TCP是TCP/IP体系结构中位于传输层的面向连接的协议,提供可靠的字节流传输。通信双方需要建立连接,发送端的所有数据按顺序发送,接受端按顺序接收。

  Java提供了ServerSocket类和Socket类用于基于TCP流式Socket的网络通信。ServerSocket类用于服务器,监听来自客户机的连接请求。Socket类用于客户机及服务器,建立客户机和服务器的连接。客户机与服务器建立起连接后,就可以基于此连接进行流式通信。

2. 服务器程序

(1)监听请求

  在服务器程序中建立ServerSocket类对象,在某一端口监听来自客户机的连接请求。ServerSocket类的构造方法如下:

  public ServerSocket(int port)

  其中,int类型的port表示监听请求的端口号。

  创建ServerSocket类对象时,可能触发IOException异常,在程序中需要进行抛出或捕获处理。

(2)捕获请求

  在服务器程序中调用ServerSocket类的的accept()方法,捕获客户机的连接请求。方法使服务器程序处于阻塞状态,直到捕获到来自某一客户机的连接请求。当捕获到来

自某客户机通过其Socket 类对象发送来的连接请求时,accept()方法返回(创建)与
请求对应的Socket类对象,建立起与客户机的连接。
当在服务器创建了Socket 类对象后,就可以通过该类对象与所连接的客户机进行流
式通信。
  accept()方法的声明如下:public Socket accept();
  为了让服务器在500号端口监听连接请求,并当捕获到客户机的连线请求时,创建对位的Socket类对象ssocket.建立起与客户机的连接,可以使用以下动句序到:
  ServerSocket server1=new ServerSocket (5000);
  Socket ssocket=server1. accept()

(3)流式通信

  Socket类提供了getInputStream()方法和getOutputStream()方法, 生成对应的InputStream类对象和OutputStream类对象。通过InputStream类对象从所连接的客户机获取信息,通过OutputStream类对象向所连接的客户机发送信息。

  创建Socket类对象时,可能触发IOExeption类异常,在程序中需要进行物出或捕获处理。

为了便于输人(获取)和输出(发送)信息,可以在生成的InputStream和OutputStream基础上,创建DataInputStream 、DataOutpuStraem或PintStream等类对象;对于

文本流通信,可以创建InputStreamReader、OutputStreamReader或PrintWriter

等类对象进行通信处理。

  例如,为Socket类对象socket建立DataInputStream类对象is和PrintStream 类对象ps,可以使用以下语句序列:

DataInputStream is=new DataInputStream (ssocket.getInputstream());

PrintStream ps=new PrintStream( new BufferedOutputStream(ssocket.getOutputStream());

(4)结束通信

  通信任务完成后,应该将Socket 类对象关闭,切断与客户机的连接,并关闭对应的流对象,以释放所占资源。

  关闭Socket类对象要使用Socket类的close()方法。close()方法声明如下:

  public void close () ;

  注意:先关闭流对象,后再关闭Socket类对象。

3. 客户机程序

  客户机程序的流程如下:
  ( 1)建立连接
  在客户机程序中创建Sockel类对象,向指定服务器的某端口 发送连接请求。Socket类的构造方法如下:
  public Socket (InetAddress addr,int port) ;
  public Socket(String host,int port) ;
  其中,addr 表示服务器的InetAddress类对象,host 表示服务器的域名或IP地址,port表示服务器端口号。
  创建Socket 类对象时,可能触发I0Exception 类异常,在程序中需要进行抛出或捕获处理。
  当在客户机创建了Socket 类对象,与指定的服务器建立起连接后,就可以通过该类对象与所连接的服务器进行流式通信。
  例如,百度Web服务器的域名为www.baidu.com, IP地址为119.75.217.109。 客户机向该服务器80号端口发送连接请求,建立Socket类对象soc,可以采用以下两条语句中
的任一条:
  Socket soc=new Socket ("www. baidu. com",80) ;
  Socket soc=new Socket ("119.75.217.109",80);
(2)流式通信
  调用Socket 类对象的getlnputStream( )方法和getOutputream( )方法,生成对应的InputStream类对象和OutputStream类对象。通过InputStream类对象从所连接的服务器获取信息,通过OutputStream类对象向所连接的服务器发送信息。

 

(3) 结束通信

 

  通信任务完成后,应该将Socket类对象关闭,切断与服务器的连接,并关闭对应的流对象,以释放所占资源。

4.多线程实现双机通信

package chat;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;

public class Client {
    public static void main(String[] args) {
        Socket csocket=null;
        BufferedReader csockIn;
        PrintWriter csockOut;
        try {
            csocket=new Socket("127.0.0.1",8800);
            ClientThreadReceive ctr=new ClientThreadReceive(csocket);
            Thread thC=new Thread(ctr);
            thC.start();
            ClientThreadSend ctS=new ClientThreadSend(csocket);
            Thread thS=new Thread(ctS);
            thS.start();
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
package chat;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;

public class ClientThreadReceive implements Runnable{
    Socket csocket=null;
    BufferedReader csockIn;
    public ClientThreadReceive(Socket csocket) throws IOException {
        super();
        this.csocket = csocket;
        csockIn=new BufferedReader(new InputStreamReader(csocket.getInputStream()));
    }
    @Override
    public void run() {
        while(true){
            String s;
            try {
                s = csockIn.readLine();
                System.out.println("client receiving:"+s);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }   
    }
}
package chat;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;

public class ClientThreadSend implements Runnable{
    Socket csocket=null;
    PrintWriter csockOut=null;
    BufferedReader input=new BufferedReader(new InputStreamReader(System.in));
    
    public ClientThreadSend(Socket csocket) throws IOException {
        super();
        this.csocket = csocket;
        csockOut=new PrintWriter(csocket.getOutputStream());
    }

    @Override
    public void run() {
        while(true){
            String s3;
            try {
                s3 = input.readLine();//从键盘读取一行信息
                csockOut.println(s3);
                csockOut.flush();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }    
    }
package chat;
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; public class Server { public static void main(String[] args) throws IOException { ServerSocket serverSocket=null; Socket ssocket=null; BufferedReader ssockIn; PrintWriter ssockOut; serverSocket=new ServerSocket(8800); System.out.println("等待客户端连接"); ssocket=serverSocket.accept();//会阻塞 ServerThreadReceive threadR=new ServerThreadReceive(ssocket); Thread thread=new Thread(threadR); thread.start();
ServerThreadSend threadS=new ServerThreadSend(ssocket); Thread thread2=new Thread(threadS); thread2.start(); } }
package chat;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;

public class ServerThreadReceive implements Runnable{
    Socket ssocket;
    BufferedReader ssockIn=null;
    public ServerThreadReceive(Socket ssocket) throws IOException {
        super();
        this.ssocket = ssocket;
        ssockIn=new BufferedReader(new InputStreamReader(ssocket.getInputStream()));
    }

    @Override
    public void run() {
        while(true){
            String s = null;
            try {
                s = ssockIn.readLine();
                System.out.println("server receivging:"+s);    
            } catch (IOException e) {
            
                e.printStackTrace();
            }        
        }    
    }
}
package chat;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;

public class ServerThreadSend implements Runnable{
    Socket ssocket;
    PrintWriter ssockOut;
    BufferedReader input=new BufferedReader(new InputStreamReader(System.in));
    public ServerThreadSend(Socket ssocket) throws IOException {
        super();
        this.ssocket = ssocket;
        ssockOut=new PrintWriter(ssocket.getOutputStream());
    }

    @Override
    public void run() {
        while(true){
            try {
                String s3=input.readLine();
                ssockOut.println(s3);
                ssockOut.flush();
            } catch (IOException e) {
                e.printStackTrace();
            }    
        }
    }
}

 

标签:Java,Socket,java,客户机,编程,io,new,import
From: https://www.cnblogs.com/wancy/p/16984477.html

相关文章

  • java泛型
    1.泛型方法/**<T>表示本方法持有一个不确定类型T,表示本方法是一个泛型方法*T返回值类型为T类型的对象*Class<T>clazz:只有通过反射才能拿到泛型T的对象,因为方......
  • Go--并发编程
    摘抄(有删改):https://www.topgoer.cn/docs/golang/chapter09-1一、并发介绍1.1进程和线程进程是程序在操作系统中的一次执行过程,系统进行资源分配和调度的一个独立单位......
  • java 浮点数 判断相等
    浮点数之间的等值判断,基本数据类型不能使用==进行比较,包装数据类型不能使用equals进行判断。说明:浮点数采用“尾数+阶码”的编码方式,类似于科学计数法的“有效数字+指......
  • python并发编程之asyncio协程(三)
    协程实现了在单线程下的并发,每一个协程共享线程的几乎全部的资源,除了协程本身私有的上下文栈;协程的切换属于程序级别的切换,对于操做系统来讲是无感知的,所以切换速度更快、......
  • JVM的内存区域划分(面试问题:你了解java内存模型么)
    学过C语言的朋友都知道C编译器在划分内存区域的时候经常将管理的区域划分为数据段和代码段,数据段包括堆、栈以及静态数据区。那么在Java语言当中,内存又是如何划分的呢?......
  • Java 如何有效地避免OOM:善于利用软引用和弱引用
    想必很多朋友对OOM(OutOfMemory)这个错误不会陌生,而当遇到这种错误如何有效地解决这个问题呢?今天我们就来说一下如何利用软引用和弱引用来有效地解决程序中出现的OOM问题......
  • 如何学习编程语言大揭秘(以C++为例)!!一
    在网上C++的教程多如牛毛,都有一个特点就是让读者扮演第三人称,如观看电影那样,效果最好的是让读者戴上3D眼镜可以有身临其境的感觉,但还是第三人称。第三人称教程的缺点有:很......
  • java虚拟机指南
    JVM内存区域我们在编写程序时,经常会遇到OOM(outofMemory)以及内存泄漏等问题。为了避免出现这些问题,我们首先必须对JVM的内存划分有个具体的认识。JVM将内存主要划分为:方法......
  • Java技术点
    1.面经1.1.Redis1.缓存穿透,缓存击穿,缓存雪崩1.缓存穿透缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在,这样缓存永远不会生效,这些请求都会被打倒数据库上。......
  • java内存模型
    一.内存模型的相关概念。大家都知道,计算机在执行程序时,每条指令都是在CPU中执行的,而执行指令过程中,势必涉及到数据的读取和写入。由于程序运行过程中的临时数据是存放在......