#2 q
Bomba, dík moc :-)
Příspěvky odeslané z IP adresy 92.245.198.–
Ahoj, nevěděl by ste mi někdo říct kde dělám chybu? Snažím se o komunikaci TCP/IP klient server, kdy klient se připojí k serveru pošle nějaká data a server to přečte a zobrazí. Můj problém je že i když spojení navážu, text se přenese, tak jako výstup se mi zobrazí nesmysly. Dík
Server
#include <iostream>
#include <arpa/inet.h>
using namespace std;
int main(int argc, char** argv) {
sockaddr_in serverAddr;
sockaddr_in clietnAddr;
int mainSocket;
int client;
socklen_t clientLen;
if((mainSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_IP)) == -1) {
cerr << "chyba vytváření socketu\n";
return -1;
}
serverAddr.sin_family = AF_INET;
serverAddr.sin_port = htons(9939);
serverAddr.sin_addr.s_addr = INADDR_ANY;
if(bind(mainSocket, (sockaddr*) &serverAddr, sizeof(serverAddr)) == -1) {
cerr << "chyba pojemnování socketu\n";
return -1;
}
if(listen(mainSocket, 10) == -1) {
cerr << "chyba fronty\n";
return -1;
}
clientLen = sizeof(clietnAddr);
client = accept(mainSocket, (sockaddr*) &clietnAddr, &clientLen);
if(client == -1) {
cerr << "chyba připojení\n";
return -1;
}
char buffer[1000];
string text = "";
int byteRead = 0;
do {
byteRead = recv(client, buffer, 999, 0);
cout << "přečteno : " << byteRead << endl;
text += buffer;
} while(byteRead > 0);
cout << text;
}
klient
#include <iostream>
#include <arpa/inet.h>
#include <string>
using namespace std;
int main(int argc, char** argv) {
sockaddr_in serverAddr;
int mainSocket;
string text = "Ahoj já sem klient";
if((mainSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_IP)) == -1) {
cerr << "chyba vytváření socketu\n";
return -1;
}
serverAddr.sin_family = AF_INET;
serverAddr.sin_port = htons(9939);
serverAddr.sin_addr.s_addr = inet_addr("192.168.0.103");
if(connect(mainSocket, (sockaddr*) &serverAddr, sizeof(serverAddr)) == -1) {
cerr << "chyba spojení\n";
return -1;
}
if(send(mainSocket, &text, text.size() + 1, 0) == -1) {
cerr << "Chyba odesílání\n";
return -1;
}
}
Jo jo dík už sem to našel pravým na projekt -> Properties -> C/C++ Build -> Setings -> C++ Linker -> Libraries
Ahoj
Uměl by ste mi někdo poradit kde a jak mám v Eclipsu nastavit parametry pro překlad? Například když pracuju s vlákny abych nemusel neustále překládat program v terminálu stylem g++ ./program.cpp -lpthread, ale mohl dát rovnou Run v IDE.
#2 q
Aplikace klient / server posílají si mezi sebou data přez SocketChannel, jenom nevím dopředu jak budou veký. Když čtu z kanánlude de to v pohodě a na velikosti bufferu v podstatě nezáleží a přečte mi to jako jednu příchozí zprávu.
String data = "";
int nacteno = socketChannel.read(buffer);
while(nacteno > 0) {
buffer.flip();
while(buffer.hasReamaning()) {
data += (char) buffer.get();
}
buffer.clear();
nacteno = socketChannel.read(buffer);
}
Teď mi de o to jak podobným způsobem odeslat data bet toho aniž bych musel realokovat buffer podle velikosti odesílaných dat...
Ahoj
Potřeboval bych pomoct s zapisováním bajtů do SocketChannelu. Dejme tomu že mám zprávu dlouhou 100 bajtů, ale ByteBuffer alokovanej jenom na 50. Šlo by nějak pomocí něj zprávu odeslat aniž bych předem musel buffer zvětšit?
Dobrý den přeju
Chtěl bych se na vás obráti s problémem ohledně dědičnosti. Mám vytvořenou třídu A a od ní zděděnou třídu B, samy o sobě tyhle třídy fungují jak mají, ale v programu se až za chodu rozhoduje která z nich se má použít. Můj pokus o řeší byl následovný
A* třída;
if(podmínka splněna) {
třída = new A();
} else {
třída = new B();
}
Problém spočívá v tom že i když se třída A inicializuje pomocí třídy B tak stejně vykonává metody třídy A.
Za pomoc předem děkuji.
Náhoda, nejde to jakou dobu a přijdu na to jen co to napíšu na fórum... Pomohlo vytvořit .jar a javah použít na něj...
Zdravím, už delší dobu se pokouším zprovoznit java native interface Ale ztroskotal sem hned na uplným začátku. Nejdřív zkompiluju přez javac, to je všechno OK, ale jakmile se pokusím vytvořit hlavičkovej soubor tak mi to háže chybu
Exception in thread "main" java.lang.IllegalArgumentException: Not a valid class name: JNI.class
at com.sun.tools.javac.api.JavacTool.getTask(JavacTool.java:177)
at com.sun.tools.javac.api.JavacTool.getTask(JavacTool.java:68)
at com.sun.tools.javah.JavahTask.run(JavahTask.java:509)
at com.sun.tools.javah.JavahTask.run(JavahTask.java:335)
at com.sun.tools.javah.Main.main(Main.java:46)
kód v jave je
package test;
public class JNI {
private native void pozdrav();
static {
System.loadLibrary("HelloWorld");
}
public static void main(String[] args) {
new JNI().pozdrav();
}
}
při kompilaci postupuju
- javac JNI.java
-javah -jni JNI.class
OS Fedora 64bit, dík za příadnou pomoc!
#3 Anonym
Tak to pak jedině asi budeš muset tu metodu rozšířit "extends"
=>
package metody;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.Timer;
public class SuperButton extends JButton implements ActionListener {
private final Timer timer;
private int X = 0;
private int Y = 0;
public SuperButton() {
setVisible(true);
setText("tlacitko");
setBounds(X, Y, 90, 30);
timer = new Timer(1000, this);
timer.start();
}
@Override
public void actionPerformed(ActionEvent e) {
X++;
Y++;
setBounds(X, X, 90, 30);
this.repaint();
}
}
A v JFrame pak
package metody;
import javax.swing.JButton;
public class Okno extends javax.swing.JFrame {
private final JButton tlacitko;
public Okno() {
initComponents();
tlacitko = new SuperButton();
this.add(tlacitko);
}
.
.
.
.
.
A nebylo by lepší volat z GUI metodu třídy která bude mít na starosti například to přesouvání tlačítka?
např:
public class GUI extends javax.swing.JFrame {
Trida t = new Trida();
.
.
.
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
jButton1.setLocation(jButton1.getX() + t.get_X(), jButton1.getY() + t.get_Y());
}
a třída
package metody;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.Timer;
public class Trida implements ActionListener {
private final Timer timer;
private int X = 0;
private int Y = 0;
public Trida() {
timer = new Timer(1000, this);
timer.start();
}
public int get_X() {
return X;
}
public int get_Y() {
return Y;
}
@Override
public void actionPerformed(ActionEvent e) {
X++;
Y++;
}
}
Pokud bys chtěl pracovat s metodami konkrétního tlačítka musíš ho předat jako argument
import javax.swing.JButton;
public class Tlacitko {
private final JButton tlacitko;
public Tlacitko(JButton m_tlacitko) {
this.tlacitko = m_tlacitko;
}
void posun(int pos_X, int pos_Y) {
tlacitko.setLocation(pos_X + 1, pos_Y + 1);
}
}
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.logging.Level;
import java.util.logging.Logger;
/**
*
* @author Jenda
*/
public class Server extends Thread {
Socket s;
public static void main(String[] args) {
try {
ServerSocket ss = new ServerSocket(5222);
while (true) {
Socket s = ss.accept();
Server srv = new Server();
srv.s = s;
srv.start();
}
} catch (IOException ex) {
Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex);
}
}
/*Tady si měl jako vstupní parametr "Socket s" takže ti to
bralo z toho, ale už si nikde tomu vláknu neřekl kde to "s"
má vzít. Zkus to takhle.*/
@Override
public void run() {
try {
InputStream is = s.getInputStream(); //ze site
OutputStream os = s.getOutputStream(); // to co ja posilam do site
BufferedReader br = new BufferedReader(new InputStreamReader(is)); //obaleni buffered abych mohl cist po celych radcich
String str;
while ((str = br.readLine()) != null) {
System.out.println(">> " + str);
str = "SRV: " + str + "\n";
os.write(str.getBytes());
}
} catch (IOException ex) {
Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
dispose(); By ti mělo normálně fungovat, takže takhle těžko říct. Muže ti chybět u tlačítka nějaký Listener, nebo nevoláš dispose na příslušné okno. Mužeš zkusit this.dispose();
např:
package okno;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
public class Okno implements ActionListener {
private final JFrame okno;
private final JButton tlacitko;
public Okno() {
//Vytvořím okno
okno = new JFrame("Moje okno");
okno.setSize(400, 400);
okno.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
okno.setVisible(true);
//Vytvořím tlačítko na celou obrazovku
tlacitko = new JButton("Zavři");
okno.add(tlacitko);
tlacitko.setVisible(true);
tlacitko.addActionListener(this); //Přidám tlačítku Listener
}
@Override
public void actionPerformed(ActionEvent e) {
//po kliknutí se vykoná
okno.dispose();
}
public static void main(String[] args) {
new Okno();
}
}
Zdravím, marně se snažím přidat do JSP stránky odkaz na CSS v normálním html není problém.
Na netu sem našel několik tipů, ale nic nezabralo
<link href="${pageContext.request.contextPath}../css/style.css" rel="stylesheet" type="text/css"/>
ani
<link href="<c:url value='../css/style.css' />" rel="stylesheet" type="text/css"/>
Nevím jestli je to relevantní, jako server používám Tomcat. Za odpověď předem dík.
Pokud chceš pomocí javy naplnit DB, bylo by asi nejlepší stáhnout si nějakou knihovnu k tomu určenou a pomocí ní provádět SQL příkazy. Na youtube určitě najdeš pár tutoriálů. A co se GUI týče zkus třeba místo JCreatoru radši Netbeans, v celku pohodlně si tam nahážeš komponenty a vytvoříš pro ně akce i bez nějakýho většího programování.
No nevím jak v mssql, ale v mysql pro získání dat z SetResult ještě musíš použít .next();
Dík, funguje. Dycky hledám problém kde není...
Ahoj lidi
Mám naprogramovanou síťovou aplikaci klient server, všecko funguje skvěle, dokud jakýkoliv klient svojí aplikaci připojenou k serveru nezavře...
Vím kde je chyba
else {
SocketChannel client = (SocketChannel) chan;
client.read(buffer);
buffer.flip();
while(buffer.hasRemaining()) {
System.out.print((char) buffer.get());
}
buffer.clear();
}
client.read(buffer) - tady nejde do buffru načíst něco co neexistuje...
Takže bych potřeboval jestli nějak nejde udělat blok if něco ve stylu
if(client.read(buffer) == throws java.nio........) {}
Ahoj, začínám se učit programovat web pomocí javy a ani né že by mi něco nešlo, ale spíš bych se chtěl zeptat jestli je nějaký způsob jak asynchronně načítat stránku (např. podle vstupu do pole vypisovat obsah DB bez znovu načtení). Normálně bych k tomu použil AJAX, ale když už něco dělám tak to chci dělat pořádně, tak se chci zeptat jestli je to "profi" řešení, nebo existuje i jiný způsob.