网络编程;TCP/IP协议
网络:实现计算机之间的信息共享,数据资源的交换
协议:数据交换需要遵守的一种协议,按照约定的数据格式等写出去
端口:用于计算机之间的通信
每运行一个程序,系统会分配一个编号给该程序,作为和外界交换数据的唯一标识
0~65535
查看被使用的端口
在命令行运行netstat -ano
C/S模式:客户端和服务器共同承担计算机的体系结构
优点;a,分别负责不同的工作,快速的进行数据的传递
b,服务器可同时为数千台的客户端进行服务
c,多个客户端可以同时访问该服务器
IP 终端设备在网络中的唯一编号
查看IP
在命令行运行ipconfig
本机Ip的表示方式:localhost 127.0.0.1
万维网 公网
局域网 内网
IP地址:分为A,B,C,D四类,每个IP地址分为四个8位字节
A类:1.0.0.0到127.0.0.0
B类:128.0.0.0到 191.255.0.0
C类;192.0.0.0到 223.255.255.0
D类;224.0.0.0到 254.0.0.0
DNS;域名 将IP地址转化为一个标识
InetAddress:封装IP地址和端口
Socket
此类实现客户端套接字(也可以就叫“套接字”)。套接字是两台机器间通信的端点。
常用:
Socket() 通过系统默认类型的 SocketImpl 创建未连接套接字 |
|
Socket(InetAddress address, int port) 创建一个流套接字并将其连接到指定 IP 地址的指定端口号。 |
方法摘要
InetAddress |
getInetAddress() 返回套接字连接的地址。 |
InputStream |
getInputStream() 返回此套接字的输入流。 |
InetAddress |
getLocalAddress() 获取套接字绑定的本地地址。 |
OutputStream |
getOutputStream() 返回此套接字的输出流。 |
java.net
类 ServerSocket
此类实现服务器套接字。服务器套接字等待请求通过网络传入。它基于该请求执行某些操作,然后可能向请求者返回结果。
ServerSocket(int port)
创建绑定到特定端口的服务器套接字。
Socket |
accept() 侦听并接受到此套接字的连接。 |
InetAddress |
getInetAddress() 返回此服务器套接字的本地地址。 |
使用InetAddress来测试
package com.network.com; import java.net.Inet4Address; import java.net.InetAddress; public class InetAddressDemo { public static void main(String[] args) { try { //获得本机的地址 InetAddress LocalHost= InetAddress.getLocalHost(); System.out.println(LocalHost); //根据机器名获得相应的主机名 InetAddress name= InetAddress.getByName("127.0.0.1"); System.out.println(name); //通过域名获得主机名 InetAddress name1= InetAddress.getByName("www.baidu.com"); System.out.println(name1); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
运行结果:
baihe/192.168.43.229
/127.0.0.1
www.baidu.com/61.135.169.105
显示群聊的
package 聊天Server; /** * 服务器界面 */ import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; import java.util.ArrayList; public class SreverDemo { public static ArrayList<Socket> list = new ArrayList<Socket>(); public static void main(String[] args) { try { // 创建服务器套接字 ServerSocket server = new ServerSocket(6060); System.out.println("等待链接:"); while(true){ // 等待客户端的链接 Socket socket = server.accept(); // 输出连接到的ip和端口 System.out.println("连接上" + socket.getLocalSocketAddress() + socket.getRemoteSocketAddress()); //创建线程对象 SreverDemoThread thread = new SreverDemoThread(socket); //启动线程 thread.start(); list.add(socket); } } catch (IOException e) { e.printStackTrace(); } } }
package 聊天Server; /** * 服务器线程的输入输出 */ import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.net.InetAddress; import java.net.Socket; import java.util.ArrayList; public class SreverDemoThread extends Thread { private Socket socket; public SreverDemoThread(Socket socket) { this.socket = socket; } @Override public void run() { try { // 从Socket上获得输出流对象 OutputStream out = socket.getOutputStream(); // 包装成字符输出流 OutputStreamWriter writer = new OutputStreamWriter(out); // 包装成缓冲字符输出流 BufferedWriter bis = new BufferedWriter(writer); bis.write(socket.getRemoteSocketAddress() + "等待输出:" + "\r\n"); bis.flush(); // 获得输入流 InputStream isr = socket.getInputStream(); // 包装成字符输入流 InputStreamReader reader = new InputStreamReader(isr); // 包装成缓冲字符流 BufferedReader read = new BufferedReader(reader); // 每次读取一行 String str = read.readLine(); while (str != null) { System.out.println("说:" + str); // 遍历队列 for (int i = 0; i < SreverDemo.list.size(); i++) { // 取出队列中的个数 Socket sc = SreverDemo.list.get(i); if (sc != socket) { // 输出给其它的客户端,先获得该客户端上的套接字 OutputStream ptm = sc.getOutputStream(); // 包装成缓冲字符串 BufferedWriter bw = new BufferedWriter( new OutputStreamWriter(ptm)); // 输出 bw.write(str + "\r\n"); System.out.println(socket.getRemoteSocketAddress() + "输出:" + str); bw.flush(); } } str = read.readLine(); } } catch (Exception e) { System.out.println(socket.getRemoteSocketAddress() + ":客户端已经退出"); } } }
客户端
package qqclient; import java.awt.Color; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.net.InetAddress; import java.net.Socket; import java.text.SimpleDateFormat; import java.util.Date; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JScrollPane; import javax.swing.JTextArea; /** * 客户端界面 * * @author Administrator * */ public class ChatclientUI extends JFrame { // 属性 private JTextArea areaSend; private BufferedWriter bw; private BufferedReader br; private JTextArea area; private InetAddress name; // 主函数 public static void main(String[] args) { new ChatclientUI(); } // 构造方法 public ChatclientUI() { intitUI(); Send(); ChatClientThread th = new ChatClientThread(br, area); th.start(); } // 创建界面的方法 public void intitUI() { this.setTitle("聊天室"); this.setSize(500, 400); // 设置关闭方式 this.setDefaultCloseOperation(3); // 设置布局 this.setLayout(new FlowLayout()); // 禁止改变大小 this.setResizable(false); // 消息区域 // 设置多行文本 area = new JTextArea(); area.setPreferredSize(new Dimension(480, 200)); // 设置背景颜色 area.setBackground(Color.lightGray); // 设置字体颜色 area.setForeground(Color.green); JScrollPane pallSend = new JScrollPane(area); // 设置自动滚动 pallSend.setAutoscrolls(true); this.add(pallSend); // 消息发送区域 areaSend = new JTextArea(); areaSend.setPreferredSize(new Dimension(480, 100)); // 设置字体颜色 areaSend.setForeground(Color.blue); // 设置滚动区域 JScrollPane sendPall = new JScrollPane(areaSend); this.add(sendPall); // 设置按钮 JButton btn = new JButton("发送"); this.add(btn); LisAction lis = new LisAction(); btn.addActionListener(lis); // 设置窗体显示 this.setVisible(true); } /** * 创建客户端输入输出的方法 */ public void Send() { try { // 创建客户端 Socket socket = new Socket("127.0.0.1", 6060); name = socket.getInetAddress().getLocalHost(); // 输入输出 InputStream isr = socket.getInputStream(); OutputStream ops = socket.getOutputStream(); // 包装成缓冲输入输出流 br = new BufferedReader(new InputStreamReader(isr)); bw = new BufferedWriter(new OutputStreamWriter(ops)); } catch (Exception e) { System.out.println(name + "未连接上服务器"); } } // 创建监听器 class LisAction implements ActionListener { @Override public void actionPerformed(ActionEvent e) { String mm = areaSend.getText().trim() + "\r\n"; if ("".equals(mm) || " ".equals(mm)) { } else { try { // 将字符串写出 bw.write(name + ": " + getTime() + "\r\n" + mm); bw.flush(); // 清空 areaSend.setText(""); // 显示在消息区域 area.append(name + ": " + getTime() + "\r\n" + mm); } catch (IOException e1) { e1.printStackTrace(); } } } } // 获得当前时间的方法 public String getTime() { long time = System.currentTimeMillis(); Date date = new Date(time); SimpleDateFormat ailm = new SimpleDateFormat("y/M/d HH:mm:ss"); return ailm.format(date); } }
package qqclient; import java.io.BufferedReader; import java.io.IOException; import javax.swing.JTextArea; /** * 创建客户端线程读取 * @author Administrator * */ public class ChatClientThread extends Thread{ private BufferedReader br; private JTextArea area; private boolean islive = true; public ChatClientThread(BufferedReader br,JTextArea area){ this.br = br; this.area = area; } @Override public void run() { while(islive){ try { String mm = br.readLine(); area.append(mm+"\r\n"); } catch (IOException e) { area.append("服务器连接失败"+"\r\n"); e.printStackTrace(); } } } }
相关推荐
Socket和ServerSocket是Java网络编程中的核心组件,用于实现客户端和服务器之间的通信。在这个实践案例中,我们将深入探讨这两个类的使用以及如何构建一个简单的聊天应用。首先,我们需要理解Socket和ServerSocket的...
在"PromiseSeventeen"这个文件中,可能包含了关于Java网络编程的实例代码,帮助你更好地理解Socket和ServerSocket的使用。你可以通过运行这些代码来实践网络通信的过程,加深对C/S模式的理解。 在实际应用中,Java...
Android完全支持JDK本身的TCP,UDP网络通信API,也可以使用ServerSocket,Socket来建立基于TCP/IP协议的网络通信,也可以使用DatagramSocket,Datagrampacket来建 立基于UDP协议的网络通信
在Java编程语言中,Socket和ServerSocket是网络通信的核心组件,它们主要用于实现客户端与服务器之间的连接。本示例提供了一个基础的Socket/Serversocket应用程序,帮助开发者理解如何使用这两个类来构建基本的TCP...
在Java编程语言中,`Socket`和`ServerSocket`是用于网络通信的重要组件,它们构成了基于TCP协议的基础网络通信框架。下面将详细讲解这两个类及其在实际应用中的使用。 `ServerSocket`是Java中的服务器端套接字类,...
Socket和ServerSocket是Java编程语言中的两个核心网络通信类,它们在实现客户端-服务器应用程序时起着关键作用。本文将深入探讨这两个类的功能、用法以及如何在实际项目中使用它们。 首先,让我们理解ServerSocket...
本教程将聚焦于使用Java的Socket和ServerSocket类来构建一个基础的多人聊天室程序,这是TCP网络编程的一个经典应用。 TCP(传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。在Java中,`...
例如,构建一个简单的HTTP服务器,可以使用Socket和ServerSocket处理HTTP请求;设计一个即时通讯应用,可能需要用到TCP或UDP的Socket编程。 总之,Java网络编程与Socket编程是Java开发者必须掌握的技术之一。理解其...
通过学习和实践“华农网络编程socket通信”课程,学生可以掌握网络通信的核心技术,为开发各种网络应用打下坚实基础。在实际项目中,理解并灵活运用Socket编程能够解决许多网络通信问题,提升系统的稳定性和效率。
在Java中,Socket编程主要涉及两个关键类:`ServerSocket`和`Socket`。`ServerSocket`类用于服务器端,它监听指定端口的连接请求。创建一个`ServerSocket`实例,例如`ServerSocket server = new ServerSocket(9998);...
Socket和ServerSocket是Java编程语言中用于网络通信的重要类,它们是Java的Socket API的核心组成部分。这个"socket-serversocket"资源可能包含了一系列的代码示例,帮助初学者理解如何在客户端和服务器之间建立连接...
Java Socket网络编程是Java开发中一个重要...Java Socket编程是构建网络应用的基础,掌握其原理和实践方法对于开发分布式系统、网络服务等至关重要。通过不断实践和学习,开发者可以更熟练地运用Socket来解决实际问题。
在本项目"java网络编程socket可视化"中,我们将探讨如何使用Java Socket API创建一个简单的服务器,以及与其交互的客户端应用,同时实现数据的可视化展示。 首先,我们需要理解Socket的工作原理。Socket是网络上的...
通过阅读《Java网络编程文档教材》和《Java基础三步学会JavaSocket编程》,你可以更深入地了解Java Socket编程的细节和实践技巧。理论结合实践,才能真正掌握这一技术。在实际开发中,不断优化和调试,才能编写出...
- Java Socket类和ServerSocket类是进行TCP网络编程的核心API。 - ServerSocket用于创建服务器端的套接字,监听特定端口的连接请求。 - Socket用于创建客户端的套接字,与服务器建立连接。 3. **服务端编程**: ...
在这个实验报告中,我们主要探讨了如何使用Java的Socket和ServerSocket类进行TCP协议的客户端和服务器端编程。 实验目标是掌握Socket编程的基本方法,理解客户端与服务器端的区别,并熟练使用Socket类与...
在IT行业中,网络通信是至关重要的一个领域,特别是在分布式系统和互联网应用中。TCP(Transmission ...通过理解TCP协议的特性,以及熟练使用Java的Socket和ServerSocket类,开发者可以构建稳定、高效的网络应用。
通过实验,我们掌握了网络编程的基本概念,如客户机、服务器、协议、端口等,并且了解了 Java.net 包中常用的网络编程工具类的功能和使用。 一、多线程编程 多线程编程是指在一个程序中使用多个线程来实现并发执行...
在IT行业中,网络编程是构建分布式系统和网络应用的基础,而C#作为一种强大的面向对象的编程语言,提供了丰富的工具和库来支持网络通信。本文将深入探讨C#中的Socket网络编程,结合源代码实例,帮助你更好地理解和...