Java网络编程,我们先来看下面这一张图:

由图可得:想要进行网络编程,首先是服务器端通过ServerSocket对某一个端口进行监听。通过accept来判断是否有客户端与其相连。若成功连上,则通过readline和println函数来进行数据的发送和接收。实现网络编程。

示例如下:

服务器端代码:

/*
* 功能:演示Java网络编程的服务器端
* author:ywq
*/
import java.io.*;
import java.net.*;
public class TestServer { InputStreamReader isr;
BufferedReader br;
PrintWriter pw; public static void main(String[] args) {
TestServer ts=new TestServer(); }
public TestServer()
{ try {
//监听某个端口
ServerSocket ss=new ServerSocket(9999);
System.out.println("我是socket服务器正在监听9999端口.........");
//等待某个客户端来连接,accept()函数将返回一个socket连接
Socket s=ss.accept(); //要读取s中传递的数据
isr =new InputStreamReader(s.getInputStream());
br=new BufferedReader(isr);
//通过readline()函数来读写数据
String info=br.readLine();
System.out.println("服务器收到的消息为:"+info); //我们通过pw向s写数据,true表示即时刷新
pw=new PrintWriter(s.getOutputStream(),true);
pw.println("你也好,我是服务器!!!");
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
if(pw!=null)
pw.close();
if(br!=null)
br.close();
if(isr!=null)
isr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}

客户端代码:

/*
* 功能:这是一个客户端,可以连接服务器端
* author:ywq
*/
import java.io.*;
import java.net.*;
public class TestClient { InputStreamReader isr;
BufferedReader br;
PrintWriter pw; public static void main(String[] args) {
TestClient tc=new TestClient();
} public TestClient()
{
try {
//socket()函数就是去连接某个服务器,ip+端口
Socket s=new Socket("127.0.0.1",9999); //如果s连接成功,就可以发送数据到服务器端
//我们通过pw向s写数据,true表示即时刷新
pw=new PrintWriter(s.getOutputStream(),true);
pw.println("你好,我是客户端!!!"); //读取s中传递的数据
isr =new InputStreamReader(s.getInputStream());
br=new BufferedReader(isr);
/ /通过readline()函数来读写数据
String info=br.readLine();
System.out.println("客户端收到的消息为:"+info); } catch (IOException e) { e.printStackTrace();
}finally{
try {
if(pw!=null)
pw.close();
if(br!=null)
br.close();
if(isr!=null)
isr.close();
} catch (IOException e) {
e.printStackTrace();
}
} }
}

发送数据时用到了PrintlnWriter对象,标准形式为:

PrintWriter pw=new PrintWriter(s.getOutputStream(),true)

其中true参数表示即时刷新。

通过InputStreamReader以及readline函数来实现数据的读取。

下边是一个半双工的示例:

服务器端代码:

/*
* 功能:演示从控制台进行对话
* author:ywq
*/
import java.net.*;
import java.io.*;
public class TestServer { InputStreamReader isr,isr2;
BufferedReader br,br2;
PrintWriter pw;
public static void main(String[] args) {
// TODO Auto-generated method stub
TestServer ts=new TestServer();
} public TestServer()
{
try {
ServerSocket ss=new ServerSocket(3002);
System.out.println("服务器在监听3002端口...");
//判断是否有客户端连接
Socket s=ss.accept();
//读取来自客户端的消息
isr=new InputStreamReader(s.getInputStream());
br=new BufferedReader(isr); pw=new PrintWriter(s.getOutputStream(),true);
//接收从控制台输入的信息
isr2=new InputStreamReader(System.in);
br2=new BufferedReader(isr2); while(true)
{ String respone=br.readLine();
if(respone.equals("再见"))
{
System.out.println("对话结束");
s.close();
break;
}
System.out.println("客户端说:"+respone); System.out.println("请输入要发送到客户端的信息:");
String info=br2.readLine();
//将消息发送给客户端
pw.println(info);
if(info.equals("再见"))
{
System.out.println("对话结束");
s.close();
break;
} } } catch (IOException e) { e.printStackTrace();
}finally
{
if(br2!=null)
try {
br2.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(isr2!=null)
try {
isr2.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(pw!=null)
pw.close();
if(br!=null)
try {
br.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(isr!=null)
try {
isr.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} }
}
}

客户端代码如下:

/*
* 功能:这是一个客户端,实现从控制台输入数据
* author:ywq
*/
import java.io.*;
import java.net.*;
public class TestClient { InputStreamReader isr,isr2;
BufferedReader br,br2;
PrintWriter pw;
public static void main(String[] args) {
// TODO Auto-generated method stub
TestClient tc=new TestClient();
} public TestClient()
{
try {
Socket s=new Socket("127.0.0.1",3002);
pw=new PrintWriter(s.getOutputStream(),true);
//从控制台接收消息
isr=new InputStreamReader(System.in);
br=new BufferedReader(isr); //从服务器接收信息
isr2=new InputStreamReader(s.getInputStream());
br2=new BufferedReader(isr2); while(true)
{
System.out.println("请说出你想对服务器说的话,按回车键结束");
//得到从控制台输入的消息
String resp=br.readLine();
//将数据发送给服务器
pw.println(resp);
if(resp.equals("再见"))
{
System.out.println("客户端使对话结束");
s.close();
break;
} String respo=br2.readLine();
if(respo.equals("再见"))
{
System.out.println("服务器使对话结束");
s.close();
break;
} System.out.println("服务器说:"+respo); } } catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally
{
if(br2!=null)
try {
br2.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(isr2!=null)
try {
isr2.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(pw!=null)
pw.close();
if(br!=null)
try {
br.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(isr!=null)
try {
isr.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} } } }

自此,学到了基本的Java网络编程知识,有待进一步拓展。


进一步学习:

下面看一个简易对讲机的实现:

服务器端代码:

/*
* 功能:这是一个服务器,实现简易的对讲机,带界面
* author:ywq
*/
import javax.swing.*; import java.net.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*; public class TestServer3 extends JFrame implements ActionListener{ //定义组件
JTextArea jta=null;
JTextField jtf=null;
JButton jb=null;
JPanel jp=null;
JScrollPane jsp=null; InputStreamReader isr=null;
BufferedReader br=null;
PrintWriter pw=null; public static void main(String[] args) {
// TODO Auto-generated method stub
TestServer3 ts=new TestServer3();
} public TestServer3()
{
//创建组件
jta=new JTextArea();
jtf=new JTextField(10);
jb=new JButton("发送");
//设置监听
jb.addActionListener(this); jsp=new JScrollPane(jta); jp=new JPanel();
jp.add(jtf);
jp.add(jb); this.add(jp,"South");
this.add(jsp,"Center"); this.setSize(300, 300);
this.setVisible(true);
this.setTitle("简易QQ聊天--服务器");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //建立socket连接
try {
ServerSocket ss=new ServerSocket(1234);
Socket s=ss.accept(); isr=new InputStreamReader(s.getInputStream());
br=new BufferedReader(isr);
pw=new PrintWriter(s.getOutputStream(),true);
//做一个循环
while(true)
{
//在循环中读取来自客户端的消息并且显示
String info=br.readLine();
jta.append("客户端说: "+info+"\r\n"); } } catch (IOException e) { e.printStackTrace();
} } @Override
public void actionPerformed(ActionEvent e) {
//进行相应的操作
if(e.getSource()==jb)
{
//点击发送按钮后,将消息发送出去
String resp=jtf.getText();
jta.append("你对客户端说: "+resp+"\r\n");
pw.println(resp);
jtf.setText(" ");
} }
}

客户端如下:

/*
* 功能:这是一个客户端。可以实现简易对讲机
* author:ywq
*/ import javax.swing.*; import java.net.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;  public class TestClient3 extends JFrame implements ActionListener{ //定义组件
JTextArea jta=null;
JTextField jtf=null;
JButton jb=null;
JPanel jp=null;
JScrollPane jsp=null; InputStreamReader isr=null;
BufferedReader br=null;
PrintWriter pw=null; public static void main(String[] args) {
// TODO Auto-generated method stub
TestClient3 tc=new TestClient3();
} public TestClient3()
{
//创建组件
jta=new JTextArea();
jtf=new JTextField(10);
jb=new JButton("发送");
//设置监听
jb.addActionListener(this); jsp=new JScrollPane(jta); jp=new JPanel();
jp.add(jtf);
jp.add(jb); this.add(jp,"South");
this.add(jsp,"Center"); this.setSize(300, 300);
this.setVisible(true);
this.setTitle("简易QQ聊天--客户端");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //建立socket连接
try {
Socket s=new Socket("127.0.0.1",1234); isr=new InputStreamReader(s.getInputStream());
br=new BufferedReader(isr);
pw=new PrintWriter(s.getOutputStream(),true); while(true)
{
//在循环中读取来自服务器的消息,并且显示
 String info=br.readLine();
jta.append("服务器说: "+info+"\r\n"); } } catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} } @Override
public void actionPerformed(ActionEvent e) {
//点击发送按钮后,将消息发送出去
if(e.getSource()==jb)
{
String resp=jtf.getText();
jta.append("你对服务器说: "+resp+"\r\n");
pw.println(resp);
//清空
jtf.setText(" ");
}
} }

代码执行过程截图如下:

由截图可以看出:本实例较好的实现了聊天功能。但是距离真的模拟QQ聊天技术还差很多。有待进一步改进。

Java网络编程学习笔记的更多相关文章

  1. java网络编程学习笔记(一)

    1.进程之间的通信 进程是指运行中的程序,进程的任务就是执行程序中的代码. 存在计算机网络上的两个进程只需要关注它们通信的具体内容,而不需关注消息在网络上传输的具体细节. 2.计算机网络的概念 Int ...

  2. java 网络编程学习笔记

    1.IP地址 IP地址组成:网络号段+主机号段 IP地址分类: A类:第一号段为网络号段+后三段的主机号段 1.0.0.1---127.255.255.254(10.x.x.x是私有地址) 一个网络号 ...

  3. java网络编程学习笔记(四):线程池的实现

    package QQ; import java.util.LinkedList; /** * Created by hu on 2015/11/9. */ public class ThreadPoo ...

  4. java网络编程学习笔记(二):socket详解

    1.Socket有多种构造方法,大多数构造方法在构造的时候就指定了连接的主机和端口号.当客户端的构造方法与服务器连接的时候,可能需要等待一段时间,因为需要建立连接.默认情况下,Socket的构造方法会 ...

  5. java网络编程学习笔记(三):ServerSocket详解

    1.ServerSocket的构造方法 ServerSocket(); ServerSocket(int port); ServerSocket(int port,int backlog); Serv ...

  6. JAVA GUI编程学习笔记目录

    2014年暑假JAVA GUI编程学习笔记目录 1.JAVA之GUI编程概述 2.JAVA之GUI编程布局 3.JAVA之GUI编程Frame窗口 4.JAVA之GUI编程事件监听机制 5.JAVA之 ...

  7. 转 网络编程学习笔记一:Socket编程

    题外话 前几天和朋友聊天,朋友问我怎么最近不写博客了,一个是因为最近在忙着公司使用的一些控件的开发,浏览器兼容性搞死人:但主要是因为这段时间一直在看html5的东西,看到web socket时觉得很有 ...

  8. JAVA TCP网络编程学习笔记

    一.JAVA网络编程概述 网络应用程序,就是在已实现网络互联的不同计算机上运行的应用程序,这些程序之间可以相互交换数据.JAVA是优秀的网络编程语言,Java网络编程的类库位于java.net包中.J ...

  9. Java 网络编程学习总结

    新手一枚,Java学习中,把自己学习网络编程的知识总结一下,梳理下知识,方便日后查阅,高手莫进. 本文的主要内容: [1]    网络编程认识                [2]  TCP/IP编程 ...

随机推荐

  1. 为什么越来越多公链项目将WASM拥入怀中?

    最近越来越多的项目开始转向VNT使用的WASM,像EOS.Ontology,包括最初引入虚拟机EVM运行智能合约环境的以太坊,最近也开始转向使用WASM. 什么是WASM? WASM ,全称:WebA ...

  2. Linux:NFS文件共享问题重新认识

    之前也搭建过nfs,服务器之间目录里面的文件同享也一直正常.今天有现场反映,搭建nfs后,客户端文件在服务器端看不见. 在我之前的认识里,服务器端搭建好并启动nfs服务,客户端mount后,客户端.服 ...

  3. js获取form的方法

    先来看下面代码: ? <html> <head> <scirpy> window.onload=function(){    var f1=document.f1; ...

  4. 【POJ 2411】 Mondriaan's Dream

    [题目链接] 点击打开链接 [算法] 很明显,我们可以用状态压缩动态规划解决此题 f[n][m]表示n-1行已经放满,第n行状态为m的合法的方案数 状态转移方程很好推 注意这题时限较紧,注意加一些小优 ...

  5. 【NOIP2016】 组合数问题

    [题目链接] 点击打开链接 [算法] 杨辉三角 + 二维前缀和 O(1)计算答案 [代码] #include<bits/stdc++.h> using namespace std; #de ...

  6. 廖雪峰python3练习题一

    数据类型和变量 题目: 答案: print(123) print(456.789) print('\'Hello,world\'') print('\'Hello,\\\'Adam\\\'\'') p ...

  7. Code:NLog

    ylbtech-Code:NLog 1. NLog介绍使用返回顶部 1. NLog是什么 NLog是一个基于.NET平台编写的类库,我们可以使用NLog在应用程序中添加极为完善的跟踪调试代码.NLog ...

  8. Hello World 4 JQuery

    Hello World 4 JQuery <html> <head> <script type="text/javascript" src=" ...

  9. C++初学(1) 简单的加减乘除取余运算代码

    //---------------+-*/%算法---------------------------------------------------------- #include <iost ...

  10. 泛型Class<T>和 T. <T>

    private T product; private Class<T> product; 这两个有什么区别呢,查了资料才知道,单独的T 代表一个类型 而 Class<T>代表这 ...